MRP开发帮助文档 下载本文

况是,读取压缩包的大小50K,解压到内存里200K,再拷贝到代码区200K,所以内存的峰值是450K。加了\后,内存的峰值是50K+200K=250K。

但是代码加载完成后,两者的内存使用量都是相同的,都占用200K的内存。

如果遇到,代码量过大,导致游戏无法打开的时候,可以尝试在工程文件里加\来解决,不过加这个代码的缺点是SPR版本将无法使用,只能出MTK。 添加的方法是在工程文件里添加,可以加在bmp_mode的前面: loader=c

bmp_mode=normal

4.22 游戏在测试的时候会出现死机,我们这边的手机可以一直玩,没有出现死机。内存检查没发现遗漏,运行时也一直剰200K左右的内存,有可能是什么原因?

答:死机的问题,一般都会跟内存有关系,不当的内存操作,内存和数组越界这些都可能导致手机死机和重启现象。这个问题,开发工程师查了以后,发现是不小心把一个地方的资源释放了。内存被错误释放,在一些机型上,可能还可以正常运行,但是在其它一些机型上,可能会马上出错,死机或者重启。这可以作为单机型或部分机型问题的一个调查方向。

4.23目前分包游戏英文模式或者飞航模式无法进去游戏问题。 现象:英文状态或飞航模式下,应用自动退出。 原因:该问题由于先前给部分合作CP的示例代码遗漏导致,具体和i18n.c中SGL_LoadString函数中_DEBUG_宏之间的代码有关系,要求各个合作CP检查i18n.c代码。 1、正确的SGL_LoadString的代码如下:

2、对国内分包的游戏,建议直接写成SGL_SetCurrentLanguage(1000),忽略mrc_intiChargeOverSea中的返回的数值。

3、SGL_LoadString(STR_LAN_VALID)这个步建议省去,或者

将gPayInfo.AppLanguageID仍然设置成1000。

4.24 有没有控制背光灯的接口函数?游戏中是否能禁止关闭背光灯,屏幕常亮?

答:SDK中包含控制背光灯的接口函数,mrc_LCDCanSleep函数,包含在mrc_exb.h中。 禁止休眠:mrc_LCDCanSleep(0) 允许休眠:mrc_LCDCanSleep(1)

不过游戏中是禁止开启屏幕常亮的,因为开启屏幕常亮以后,会增加手机的耗电量,这个是多个手机厂家要求的。所以除非特殊需求,是禁止开启屏幕常亮的。 对于动感游戏,要求如果动感芯片初始化成功并且用户选择使用动感功能,则开启屏幕常量,游戏退出时恢复为允许LCD休眠。

4.25 个别型号的SPR手机,长时间不操作,暗屏后恢复,图片会花屏,甚至手机会重启,什么原因?

答:个别型号的SPR手机,暗屏的过程中,会关闭T卡,但代码还会执行。所以在暗屏的过程,正好要读取资源文件,或者加载图片,就会失败,很可能会导致游戏异常。

目前的解决方法:

1、在加载资源和图片,和写文件的时候,做一些判断和保护。

2、SPR版本的游戏,游戏中开启屏幕常亮,禁止休眠。退出游戏前,一定要记得关闭屏幕常亮。

3、SPR版本,文件读写的时候,开启屏幕常亮,操作完成后,关闭屏幕常亮。

4.26 分包和文字分离的游戏,模拟器读取语言包时出错,可能是什么原因? 答:一般模拟器上缺字或者乱码的问题,都是由以下几个原因造成的: 1、 EXCEL表改掉以后,没有重新合并生成MRP包。

2、 EXCEL更新了以后,代码中引用的res_str.h文件却没有相应的更新。

3、 EXCEL表中添加了新文字,并且在代码中引用了新的ID,但EXCEL表没有重新生成过。 所以,分包游戏在模拟器上调试的时候,需要注意下面一些方面:

1、 需要用到的文字,已经通过EXCEL表资源文件,并合并到最终的MRP包里。

2、 模拟器中调用的res_str.h头文件,是跟打包到MRP包里的文字资源是相配套的。

4.27 模拟器打开MRP包时,提示连接WAP错误,对话框内容为“http://wap.skmeg.com/dsmWap/error.jsp”,如何处理?

答:这是由模拟器本身的一个缺陷造成的。因为模拟器中读取文件路径的BUF有限,如果使用很深的路径,很长的文件夹名称,或者MRP包名称太长,都有可能引起模拟器无法正常运行。所以平时利用模拟器进行调试的时候,记得别使用很长的文件夹和文件名称,和太深的路径。

还有,模拟器的字体是不能随意更改的,一些字体在模拟器上会出现异常。建议平时将模拟器字体设置为16或24进行调试。

4.28 分包的游戏,MTK版本的文字正常,但是SPR版本的文字却显示不正常,可能是什么原因?

答:因为字节序的问题,编译时需要i18n.c里的BIG_ENDIAN宏,编译SPR版本时,在工程文件里添加BIG_ENDIAN宏即可。

4.29 使用mrc_bitmapShowFlip函数,在真机上能够正常运行,在模拟器上编译却会提示“unresolved external symbol _mrc_bitmapShowFlip”,可能是什么原因?

答:这是由模拟器相关的lib不匹配引起的,更新一下“SIM_mr_helperexb.lib”文件即可。

4.30 现在做的TMG2_ZY2是二次确认通道么,如果不是,该怎么测试二次确认画面?

答:现在我们平台上用的收费通道基本上都是不需要二次确认的。所以,需要验证和测试二次确认的功能时,用有钱的能正常发送短信的移动卡,然后把收费通道改成1号通道来测试。 正式提交测试的时候,记得把收费通道改成正常的收费通道。

4.31 假如我用mrc_bitmapNew创建了一个图片缓冲区,当我不再使用里面的内容时,应该怎样释放掉呢?

答:用mrc_bitmapLoad函数,文件名传\。详细情况查看mrc_base.h里此函数的注释。

4.32 如何获取游戏在真机中的内存使用情况?

答:真机上获取内存使用情况,必须借助手机的TRACE线,用TRACE软件来抓。手机在按键操作时,会自动打印出内存使用的TRACE信息。游戏代码中,只能用mrc_getMemoryRemain获得手机的剩余内存。

4.33 用trace软件抓trace的时候,出现\错误,是什么原因? 答:因为打印trace的优化级较低,当代码执行过于繁忙的时候,很可能就会打印不出trace,并出现\PS Frame failed\的错误提示!所以出现这个提示的时候,并不代表程序就一定有问题。

4.34 模拟器上的打出的trace信息与真机上相等吗?

答:模拟器上游戏本身的TRACE信息基本上都会打印出来的,但是模拟器和真机各自都会输出一些其它的TRACE信息,所以不一定相等的。

4.35 如何通过抓trace查看收费时的收费通道是否正确?

答:付费时,会输出“VM_LOG: SendSms Option = 0, channel = 5908, value = 20 channel”的trace信息,其中“channel = 5908”就是收费通道。

SDKv1.0.5.17&1.0.6.07版本的通道信息,是在调用mrc_initDefaultChn时显示的,显示信息为“InputDefaultChn:priChn=1,slvChn=1”,分别代表主通道和副通道。

4.36 rand()函数需要每次都给不同的参数做种子是吧? 答:不需要,一般只要每次进入游戏的时候给一次就够了。

4.37 如何从MRP头里读取MRP包的版本号? 答:用GetMrpInfo函数,示例代码: uint32 verid;

mrc_GetMrpInfo(mrc_getPackName(), MRP_APPVER, (uint8 *)&verid, 4);

4.38 同样尺寸大小的24位BMP和8位BMP内存相差多少?

答:24位的BMP在打包的时候,会被自动转换成16位的BMP,所以同样尺寸大小的24位图和16位一样,比8位图多大概1倍内存。

但是,8位图的显示效率不高,不建议使用,特别是效率要求较高的地方。

4.39 我想在TRACE线查看的到的信息中打印信息,用什么函数? 答:mrc_printf函数。

4.40 怎样查看游戏的代码量?

答:打包编译的时候,看编译信息的最后一行“Main Module”: Main Module 87.1 KB 192.9 KB

其中192.9KB是压缩前的原始代码量,87.1KB是压缩后放到MRP包里的大小。

4.41 一个自带字库的游戏,用AUX M868手机进入,然后按挂机键退出游戏。再次进入的时候,所有使用自带字库的文字都无法显示。

原因:字库文件在游戏中是一直打开着的,而AUX M868用的VM1935版本,按挂机键退出时,是不会调用mrc_exitApp的,所以退出游戏时相关没有释放文件句柄的,而且1935这个版本的VM也不会自动释放文件句柄。这样就会导致再次进入游戏的时候,无法删除文件,也无法正常创建和加载文件,从而导致字库文件的加载失败, 所有文字都无法显示。必须关机以后,或者用PC连接过手机的T卡以后,文件操作才会正常。 解决:改成每次调用完字库文件以后,就立即关闭字库文件。

4.42 在mrc_exitApp里加了自动保存的游戏,在AUX M868中,按挂机键退出,不会自动保存存档。

原因:这个手机的VM版本是1935,这个版本的VM版本,按挂机键退出的时候,是不会调用mrc_exitApp的,所以不能退出时自动保存。

解决:对于这个问题,没有根治的方法,只能尽量减少影响。而且这个是很早的VM版本,市面上也已经非常少了,所以本身影响也不会特别大。从开发的角度,重要的数据保存,比如道具消费完成等,立即存档,尽量不要等到退出时,再去保存,以免数据丢失。

4.43 购买测试SKY-MOBI平台的测试手机时,有什么要求吗?

答:手机上有mythroad平台,及相关入口的MTK和SPR手机即可。

4.44 mythroad平台可以后续安装吗?

答:不行的,这些需要我们在手机出厂之前移植过的。

4.45 编译MRP时,出现“Authorization String:Authorization failure! ”的错误提示,可能是什么原因?

答:查看网线是否已经插好,并且配置了可用的IP。

4.46 游戏在金立p300手机上,在玩的过程中,收到短信,手机会自动重启,可能是什么原

因?

答:通常是由游戏的mrc_appEvent函数对事件处理存在问题。手机收到短信的时候,会触发mrc_appEvent函数,会有事件上来。而一些游戏,是直接在mrc_appEvent函数处理事件的,而处理代码逻辑不严密。

4.47 static const Image imgInfo[1] = { {\这个这样定义全局变量,赋的初始值会不会丢失?

答:const是常量数据,是不会丢失的。

4.48 用mrc_soundSet加载的声音,那个内存是怎样释放的? 答:用mrc_soundSet,文件名传“*”,即可释放指定缓冲的声音资源。

4.49 480x320的屏幕,模拟器上设定了以后,还是显示不全,怎么办?

答:可以通过替换文件和修改一下配置,来让模拟器支持这种大尺寸的屏幕显示。

4.50 手机屏幕LCD暗屏,会不会导致mrc_resume事件? 答:不会。

4.51 mrc_checkChargeExOverSea函数检测是否注册的时候,总是返回已注册,可能是什么原因?

答:游戏注册以后,会在手机内部的存储空间上生成一个sid的备份文件。应该是之前这个游戏注册过,手机里面的备份的sid文件没有删除造成的。 具体操作:

1、 打开手机的存储空间,进入到\\mythroad\\gsidbak\\目录下,删除跟游戏短名称相对应的sid文件,例:gamename.mrp.sid。

2、 打开T卡空间,删除mythroad\\gamename\\gamename.mrp.sid文件。 这样,应该mrc_checkChargeExOverSea函数,就会返回未注册。

4.52 用分包合成的mrp包文件,在模拟器上无法运行。

原因:编译lib文件的时候,在工程文件里面添加了loader = c,加了这条语句以后,编译生成的mrp包文件就无法在模拟器上运行了。

解决:在模拟器上调试的时候,先不要加loader = c。

4.53 mrc_getTextWidthHeight获取GB码及Unicode码字符串得到的宽、高一致吗? 答案:一致。都使用的是MTK平台的系统字库。