当前位置:文档之家› 部分MTK资料

部分MTK资料

杭州斯凯SDK使用文档-FAQ篇

修订历史记录

目录

一引言 (8)

1.1编写目的 (8)

1.2适用范围 (8)

1.3定义、首字母缩写词和缩略语 (8)

1.4读者范围 (8)

二基本功能 (8)

2.1 文字绘制的功能如何实现?是否支持描点功能? (8)

2.2 画图的功能如何实现?都支持哪些图片格式? (8)

2.3 音乐播放功能如何实现?都支持哪些音乐格式?是否支持暂停播放功能? (9)

2.4 定时器如何使用?定时器个数有限制吗?使用的时候有哪些实现注意的?定时器会延

迟吗?定时器忘记删除会有什么后果? (9)

2.5 手机的按键、触摸屏事件如何接收?支持长按键和组合键功能吗?触摸屏是否有move

事件? (9)

2.6 游戏运行过程中是否会被打断?打断时候和游戏恢复时候是如何触发的,需要处理哪些

事情? (10)

2.7 游戏如何收费?都有哪些收费方法,有什么区别?是否有包月收费接口? (10)

2.8 游戏的入口函数是什么?如何退出游戏?游戏中按挂机键,是否会收到按键事件? 10

2.9 手机可以使用的内存通常有多大?游戏运行过程中如何获取内存剩余信息? (10)

2.10 如何进行文件操作?功能上是否有限制? (11)

2.11 文字都支持哪些编码?支持UTF-8编码不?是否支持unicode转GB2312? (11)

2.12 SDK支持浮点运算吗?是否有三角函数?是否有绘制圆、椭圆和弧线等接口? (11)

2.13 SDK有随机函数吗? (11)

2.14 SDK是否可以联网,进行socket通信? (11)

2.15 图片是否可以进行翻转?有相关接口吗? (12)

2.16 bmp图片在运行的时候占用多大的内存? (12)

2.17 有发送和读取短信的接口吗?有打电话的接口可以使用吗? (12)

2.18 SDK运行的手机主频有多大? (12)

2.19 编译生成的mrp文件大小有限制吗?通常大小是多少? (12)

2.20 是否有获取unicode编码长度的函数? (12)

2.21 SDK中最终可以运行的是什么样子的文件? (13)

2.21 是否可以获取屏幕缓冲区?缓冲区内存有多大?是否可以对屏幕缓冲区进行赋值操

作? (13)

2.22 如何使用输入法? (13)

2.23 是否支持自己创建空白的图片缓冲区?是否可以获取创建图片的句柄或者画笔? . 13

三 SDK使用注意实现 (14)

3.1全局变量使用注意事项 (14)

3.2局部变量使用注意事项 (14)

3.3 8bit bmp图片使用注意事项 (14)

3.4 bmp图片宽高注意事项 (14)

3.5 SPR平台游戏音乐使用问题 (14)

3.6 C语言标准库函数使用问题 (15)

3.7 mrc_exit函数使用注意事项 (15)

3.8 本地UI窗口创建使用注意事项 (15)

四常见问题原因和解决方法 (15)

4.1 游戏中为什么会出现花屏?有什么解决方法? (15)

4.2 游戏中为什么会出现死机和重启?有什么解决方法? (16)

4.3 游戏中内存申请为什么失败? (16)

4.4 编译的时候为什么会提示Authorization timeout? (16)

4.5 运行mrp文件的时候为什么会提示找不到can't find sdk key? (17)

4.6 为什么使用串口线无法抓到trace信息? (17)

4.7 为什么在模拟器上运行的游戏非常流畅而在手机上运行时候速度非常慢?有什么解决

方法? (18)

4.8 测试二次确认通道的时候,现在都需要等很久,30秒以上才能收到短信,上个月不会,

是不是SDKv1.0.3.23有什么改变导致的?试了2张卡,一张全球通,2秒就收到短信,一张神州行,要30秒才收到,都不是错误指令。 (18)

4.9 积分查询时,手机出现假死的现象,如何解决? (18)

4.10 i18n的SGL_LoadString函数,在飞航模式下会有问题。 (18)

4.11编译时出现“Undefined symbol mrc_appEvent”的error错误信息,怎么处理?. 19

4.12分包的游戏,在编译SPR版本的时候,提示“Endianness mismatch”,可能是什么问

题? (19)

4.13展讯的手机,是否需要做积分上传? (19)

4.14道具收费,发送成功以后,需要等待用户确认,还是自动返回游戏? (20)

4.15 mpr工程文件里的RAM值如何填写? (20)

4.16 手机上怎么样进行调试? (20)

4.17 mrc_bitmapGetScreen这个函数什么作用?会不会产生新的内存? (20)

4.18 编译SPR版本时,出现“Error: L6218E: Undefined symbol main (referred from

kernel.o)”的错误提示,如何处理? (20)

4.19 游戏偶尔会出现一个问题,购买东西,购买成功了,但是短信没有回复,之后购买东

西都是网络延迟,退出游戏后才能收到短信。 (21)

4.20 在每次发送短信之前,都调用mrc_initChargeOverSea(&tPayCtrlInfo),会不会有问

题? (21)

4.21 编译时加入"loader=c"有何区别?在哪里添加这串代码? (21)

4.22 游戏在测试的时候会出现死机,我们这边的手机可以一直玩,没有出现死机。内存检

查没发现遗漏,运行时也一直剰200K左右的内存,有可能是什么原因? (21)

4.23目前分包游戏英文模式或者飞航模式无法进去游戏问题。 (22)

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

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

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

什么原因? (23)

4.26 分包和文字分离的游戏,模拟器读取语言包时出错,可能是什么原因? (23)

4.27 模拟器打开MRP包时,提示连接WAP错误,对话框内容为

“https://www.doczj.com/doc/8f9969576.html,/dsmWap/error.jsp”,如何处理? (24)

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

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

4.30 现在做的TMG2_ZY2是二次确认通道么,如果不是,该怎么测试二次确认画面? .. 24 4.31 假如我用mrc_bitmapNew创建了一个图片缓冲区,当我不再使用里面的内容时,应该怎样释放掉呢? (25)

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

4.33 用trace软件抓trace的时候,出现"Get PS Frame failed"错误,是什么原因? 25 4.34 模拟器上的打出的trace信息与真机上相等吗? (25)

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

4.36 rand()函数需要每次都给不同的参数做种子是吧? (25)

4.37 如何从MRP头里读取MRP包的版本号? (25)

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

4.39 我想在TRACE线查看的到的信息中打印信息,用什么函数? (26)

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

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

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

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

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

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

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

4.47 static const Image imgInfo[1] = { {"village.bmp",160,100} }; 这个这样定义全局变量,赋的初始值会不会丢失? (27)

4.48 用mrc_soundSet加载的声音,那个内存是怎样释放的? (28)

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

4.50 手机屏幕LCD暗屏,会不会导致mrc_resume事件? (28)

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

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

4.53 mrc_getTextWidthHeight获取GB码及Unicode码字符串得到的宽、高一致吗?.. 29 4.54 游戏自Applist启动时,提示“not enough memory” (29)

4.55 部分游戏vigor-v629机型外部事件结束以后,手机画面信息残留问题。 (29)

4.56 计费短信发送成功判断。 (29)

4.57 在模拟器上编译正常,交叉编译的时候,却提示“Error: L6218E: Undefined symbol new_gameC1 (referred from mr_src_mygamecanvas.o)”的错误,可能是什么原因? .. 29 4.58 怎样查看游戏MRP包的SDK的版本号? (30)

4.59 我们这个平台,存储一些游戏相关的数据,一般都是直接写文件吗? (30)

4.60 斯凯平台MRP运行的真机如何获取? (30)

4.61游戏过程中,插入USB线,在存储提示界面按“返回”,继续游戏,稍侯显示“USB

移除”导致游戏花屏。 (30)

4.62 游戏过程中调用mrc_exit死机重启? (30)

4.63 模拟器下提示:The program 'D:\Sky_SDK\Sky_SDK\simulator\Debug\simulator.exe' has exited with code 0 (0x0). (31)

4.64、一些游戏中的对话框,做得比较漂亮,还带有圆角的,这个是怎么实现的? (31)

4.65、用VS2005模拟器,编译的时候mrc_drawTextLeft报错,如何处理? (31)

4.66、VS2005环境下,如何添加自己的LIB文件? (31)

4.67、mrc_strcmp是否支持UNICODE值比较? (31)

4.68 使用vs2005运行自动生成的helloworld时,模拟器上显示“start.mr242: cann`t find sdk key”,是什么问题? (31)

4.69 Sky-mobi平台可以使用pow函数吗?可以使用stdlib.h里面的函数吗? (32)

4.70 ACC文件读取,执行以下流程mrc_getSoundTotalTime获取的文件时间为无效时长: (32)

4.71 屏幕缓存如何操作?如果使用自己建立屏幕缓存? (32)

4.72 使用mrc_platTextNew新建一个文本窗口,按右软键退出文本框时,手机重启,可能是什么原因? (33)

4.73 把编译好的mrp包放在applist目录下,列表里却看不到这个游戏,什么原因? . 33 4.74如何在写文件的时候,追加文件内容? (33)

4.75 为什么我获取一段的文字的宽高,不管我把字体大小设置成MR_FONT_MEDIUM,还是MR_FONT_SMALL,获取到的宽高都是一样的? (33)

4.76 游戏是不是大多都采用256色的BMP图片? (33)

4.77 用mrc_textWidthHeight(str, SFFalse, MR_FONT_SMALL, (int32 *) &fntw,(int32 *) &fnth)在SPR展讯手机上获得到的宽高fntw和fnth都是0? (33)

4.78 MTK上每个指针变量本身占用多少字节空间? (34)

4.79 编译好的mrp包,如何放到真机上测试? (34)

4.80编译时提示“Error: C3028E: : implicit cast of pointer to non-equal pointer”,这是什么错误? (34)

4.81 mrc_readFileFromMrpEx函数的第三个参数为什么是“uint8 ** filebuf”,为什么要用二级指针? (34)

4.82 mrc_readFileFromMrpEx函数,第一个参数packname填NULL时,是不是就会从默认包去找了? (34)

4.83为什么我在mrc_init(void)中声明字符串char *string="\x0\x48\x0\x0";它会提示错误 error C2143: 语法错误 : 缺少“;”? (35)

4.84 mrc_readFileFromMrpEx打开的文件如何关闭? (35)

4.85资源编译打包的时候,对bmp是不是有压缩? (35)

4.86 短信中心号码为空时,mrc_scoreConfirm()函数返回成功是BUG吗? (35)

4.87 对一个全局的结构体数组进行初始化的时候,如果要保留里面的数据,是不是每个结构体成员都要const呢? (35)

4.88 游戏用了自带字库后,会额外占用多少内存? (36)

4.89 MTK平台能打开的文件数目有限制吗? (36)

4.90 mrc_bitmapShowFlip()如何画透明色? (36)

4.91 请问mtk和spr都有多少种屏幕规格啊? (36)

4.92 mrc_bitmapLoad( 29, "menu.bmp", 0,0, 240, 320, 240);这句话我再一个方法内执行很多次,就是不释放,内存会一直累加吗?还是始终在29的那个缓存内操作不产生额外的内存。 (36)

4.93 自带字库的字库生成工具中有个设置字号和一个设置big medium small,这两个有什么区别? (36)

4.94如果绘制的字符不在字库范围了,是显示异常,还是程序直接死了? (37)

4.95斯凯平台上面有没有类似MessageBox的提示框?这个函数,显示的Dialog是全屏的吗?有没有可以指定显示区域?能不能在弹出之后,在一定时间过后自动消失呢? (37)

4.96模拟器支持声音吗? (37)

4.97注册不生成sid文件是哪里找原因啊?生成sid文件不是我程序里控制吧?换卡重新注册,程序应该在哪里控制? (37)

4.98程序在手机上显示的名称,能随着手机语言切换自动变吗? (37)

4.99 我们平台如何读取文件? (38)

4.100 为什么游戏中调用mrc_initDefaultChn,游戏就挂掉了? (38)

4.101 mrc_open,如果文件名是带路径的,且路径中的目录是不存在的,会不会把目录创建出来呢? (38)

4.102 mrc_c2u,这个函数内部需要申请内存,需要使用者释放内存吗? (38)

4.103 mrc_getLen函数能否在文件被打开时获取该文件的长度? (38)

4.104 在模拟器上,我新建一个文件,缺省情况下会放到哪个目录? (39)

4.105 斯凯的SDK支持响铃(手机内置铃声)吗? (39)

4.106支持播放MID的同时振动吗? (39)

4.107 MTK版本的游戏完全正常,SPR版本进入游戏,还没显示游戏主界面的时候,手机就自动重启,可能是什么原因? (39)

一引言

1.1编写目的

该文档主要将SKY SDK基本功能和开发中遇到的常见问题做出简要描述,让各个CP工程师通过查看该文档,能快速熟悉SDK相关功能以及找到常见问题的解决方法。

1.2适用范围

本方案主要针对使用SDK的游戏应用,其他应用可参考实现。

1.3定义、首字母缩写词和缩略语

SDK:杭州斯凯网络科技有限公司的游戏开发环境。

1.4读者范围

各CP公司开发人员;本公司开发人员也可以参考。

二基本功能

2.1 文字绘制的功能如何实现?是否支持描点功能?

1mrc_drawText或者mrc_drawTextEx函数来实现;

2、不支持描点功能,提供画点函数mrc_drawPointEx。

2.2 画图的功能如何实现?都支持哪些图片格式?

1、画图功能可以通过调用mrc_bitmapShowEx或者mrc_bitmapShow来绘制16bit和24bit的bmp图片,通过mrc_bmpShow函数绘制8bit bmp图片;

2、目前我们的SDK只支持bmp格式的图片,在进行mrp打包过程中,编译器对24bit 的bmp图进行压缩成16bit的图片;

3、对于16bit的图片,SDK只支持565格式的;

2.3 音乐播放功能如何实现?都支持哪些音乐格式?是否

支持暂停播放功能?

1、音乐播放功能通过调用mr_playSoundEx或者mrc_soundPlay函数来实现,通过调用

mrc_soundStop或者mr_stopSoundEx函数来停止播放音乐;

2、目前SDK支持mid、wav和mp3等格式音乐文件;

3、SDK不支持音乐暂停播放功能,停止音乐播放以后,重新播放的时候是从头开始播放。

2.4 定时器如何使用?定时器个数有限制吗?使用的时候

有哪些实现注意的?定时器会延迟吗?定时器忘记删除会

有什么后果?

1、在使用定时器之前,先需要通过调用mrc_timerCreate来创建一个定时器,然后通过调用mrc_timerStart函数来启动定时器,最后通过调用mrc_timerStop函数来停止定时器,当不再使用某定时器的时候,通过调用mrc_timerDelete函数来删除定时器;

2、定时器的个数没有限制;

3、在使用的定时器的时候,需要注意定时器的时间单位是毫秒,而不是秒,定时器时间不要小于80毫秒,时间太小不会提高游戏运行速度,反而会有负面影响;

4、由于SDK平台只有一个线程在运行,整个运行过程都是串行的,只有当前的函数执行完成以后才会触发定时器事件;

5、由于定时器是通过队列管理的,当不使用的定时器没有被删除,那么定时器队列会越来越大,会影响定时器调用时间的,因此不使用的定时器需要调用mrc_timerDelete函数来删除定时器。

2.5 手机的按键、触摸屏事件如何接收?支持长按键和组合键功能吗?触摸屏是否有move事件?

1、当触发按键和触摸屏事件的时候,SDK会回调mrc_appEvent函数,开发者需要自己实现

mrc_appEvent函数来处理按键和触摸屏事件;

2、SDK中按键事件有两种类型,分别为按下事件和弹起事件,没有长按键事件,也没有组合键事件,开发者可以通过定时器来模拟实现长按键事件和组合键事件;

3、SDK中触摸屏事件有两种类型,分别为按下事件和弹起事件,没有move事件。(新的移植版本已支持move事件)

2.6 游戏运行过程中是否会被打断?打断时候和游戏恢复

时候是如何触发的,需要处理哪些事情?

1、游戏运行过程中,当手机来电话、短信等事情,SDK会被打断;

2、当SDK被来电等外部事件打断以后,SDK会回调mrc_pause函数,开发者需要根据具体情况实现mrc_pause函数,例如停止播放音乐;当外部事件处理完成以后,SDK会回调mrc_resume 函数,开发者需要恢复游戏,例如播放音乐和刷新游戏界面;当游戏被外部事件打断的时候,定时器会被自动暂停,当游戏恢复的时候,定时器会自动恢复。

2.7 游戏如何收费?都有哪些收费方法,有什么区别?是否有包月收费接口?

1、SDK中封装了游戏收费方法,在启动游戏的时候,调用mrc_initChargeOverSea函数来初始化收费模块,在收费的时候通过调用mrc_ChargeExOverSea来收费,退出游戏的时候通过调用mrc_releaseChargeOverSea来是否收费模块资源;

2、目前游戏的收费有两种,分别是注册收费和道具收费,它们的根本区别是注册收费的时候,SDK会在磁盘上写sid文件,而道具收费不会写文件;

3、目前SDK中没有包月收费接口,开发者可以根据进行把相关付费记录写到磁盘中来实现包月。

2.8 游戏的入口函数是什么?如何退出游戏?游戏中按挂

机键,是否会收到按键事件?

1、SDK的入口函数是mrc_init,开发者需要自己来实现mrc_init函数;

2、游戏中退出的方法,是通过调用mrc_exit函数来实现,当调用该函数以后,游戏不是马上退出,而是需要把当前函数调用执行完成,当开发者调用mrc_exit函数,SDK在退出游戏之前会回调mrc_exitApp函数,开发者可以在mrc_exitApp函数里面做些清除操作,例如关闭文件、释放收费模块资源等;

3、游戏中,用户按下挂机键,游戏不会收到按键事件,但是SDK会回调 mrc_exitApp函数。

2.9 手机可以使用的内存通常有多大?游戏运行过程中如何获取内存剩余信息?

1、目前手机上可以用的内存大小通常为650KB,包括堆内存、全局数据区和栈区(stack只有

4KB大小,不能定义大的临时变量);

2、游戏运行过程中,我们可以通过调用mrc_getMemoryRemain函数来获取当前剩余的内存大小,同时我们可以通过抓trace来获取内存峰值、当前剩余值和从未使用内存值:

手机总的可以使用内存值 = 内存峰值 + 从未使用内存值

在模拟器上,我们可以再trace窗口看到内存使用信息,如下所示:

mem:memory stack = 384 kmem:left memory = 305 k

2.10 如何进行文件操作?功能上是否有限制?

1、SDK提供了丰富的文件操作接口,可以进行创建/打开文件、读写文件、关闭文件、删除文件,具体可以查看mrc_open、mrc_read、mrc_write、mrc_close和mrc_remove函数;

2、SDK对文件操作没有限制,开发者可以根据具体情况选择相应的接口,但是SDK对文件操作的顶级有限制的,通常限制为T卡下的mythroad目录。

2.11 文字都支持哪些编码?支持UTF-8编码不?是否支持unicode转GB2312?

1、SDK支持unicode编码(大端)和GB2312编码,开发者可以根据需要使用相应的编码。

2、不支持UTF-8编码,开发者需要自己将unicode转换成UTF-8编码;

3、不支持unicode转GB2312功能。

2.12 SDK支持浮点运算吗?是否有三角函数?是否有绘制圆、椭圆和弧线等接口?

1、SDK 不支持浮点运算;

2、没有三角函数,开发者需要自己弄表格来实现;

3、SDK中没有绘制圆、椭圆和弧线等特殊形状接口。

2.13 SDK有随机函数吗?

1、SDK提供了随机函数mrc_sand和mrc_rand函数。

2.14 SDK是否可以联网,进行socket通信?

1、SDK提供了GPRS拨号、socket相关操作函数,并且简单封装了http协议,具体的函数可以看mrc_network.h头文件。

2.15 图片是否可以进行翻转?有相关接口吗?

1、图片可以进行翻转,SDK提供了bmp图片的上下和左右翻转接口;

2、bmp图片的翻转是通过调用bitmapShowFlip函数来实现的,该函数在mrc_bmp.h中声明。

2.16 bmp图片在运行的时候占用多大的内存?

1、bmp图片运行时候占用的内存大小与图片大小相关,占用的内存大小可以按如下方法计算:图片占用内存大小 = 图片宽X图片高X 2 (字节)

那么一张240x320的bmp图片,所占用的内存空间大小就是240x320x2,就是150KB大小。

2.17 有发送和读取短信的接口吗?有打电话的接口可以使用吗?

1、SDK中暂时没有短信的读取和发送接口,如果开发者有特殊需求,请联系斯凯SDK开发主管李波,E-MAIL:mailto:libo@https://www.doczj.com/doc/8f9969576.html, ,手机 135********;

2、SDK中没有打电话接口。

2.18 SDK运行的手机主频有多大?

1、SDK支持MTK和SPR手机平台,手机主频为50-100MHZ。

2.19 编译生成的mrp文件大小有限制吗?通常大小是多少?

1、SDK对编译生成的mrp文件大小是没有限制的;

2、通常情况下mrp文件的大小为100KB-250KB之间,

由于游戏是通过GPRS网络下载到用户手机上的,为了减少用户下载时间和提高下载成功率,开发者需要尽量减小mrp包大小。

2.20 是否有获取unicode编码长度的函数?

1、SDK中提供了获取unicode长度的函数mrc_wstrlen;

2.21 SDK中最终可以运行的是什么样子的文件?

1、编译过程中,编译器会把游戏中使用到的资源和代码都编译生成一个mrp文件,只需要把生成的mrp文件放到手机指定的目录就可以运行了,不需要安装;

2.21 是否可以获取屏幕缓冲区?缓冲区内存有多大?是否可以对屏幕缓冲区进行赋值操作?

1、SDK中提供了获取屏幕和设置屏幕缓冲区的接口,分别是w_getScreenBuffer和

w_setScreenBuffer函数;

2、屏幕缓冲区的大小是与手机屏幕大小相关的,通常屏幕缓冲区的大小可以如下计算:

屏幕缓冲区大小 = 屏幕宽 X 屏幕高 X 2(字节)

例如,手机屏幕大小为240X320,那么屏幕缓冲区的大小可以是

240X320X2 = 150KB,即150KB。

3、获取的屏幕缓冲区指针是指向一块与屏幕大小相适应的内存空间,因此开发者可以对该区域内存进行直接赋值操作,但是赋值过程中需要防止出现内存越界问题,否则会出现重启、malloc 失败等严重问题。

2.22 如何使用输入法?

1、SDK中提供了调用手机内置的输入法接口,开发者可以通过调用mrc_editCreate函数来实现文字输入,得到的文字是大端unicode编码格式;

2.23 是否支持自己创建空白的图片缓冲区?是否可以获取创建图片的句柄或者画笔?

1、SDK中提供了创建bmp图片的相关接口,目前只支持创建8bit的bmp图片,不支持16bit和24bit的bmp图片;

2、开发者可以通调用mrc_bmpCreate函数来实现创建空白图片,该函数返回创建图片的句柄或者画笔,具体请查看mrc_bmp.h中函数的原型。

三 SDK使用注意实现

3.1全局变量使用注意事项

1、全局变量都会被清零,开发者自己赋的初值没有效果,需要在函数里面对全局变量重新赋值;

2、若需要对变量赋初始,那么需要在使用常量,即在变量前加const关键字。

3.2局部变量使用注意事项

1、由于手机的栈空间只有4KB,因此不要在函数体里面定义较大的临时变量,即临时变量不要超过256B,如果需要这么大的临时变量,那么需要通过malloc来申请堆空间,否则,当函数调用层次较深的时候,会导致栈会溢出,结果会造成手机重启;

2、在SDK编译的时候ARM编译器会进行严格的类型检查,当涉及到变量类型匹配的时候,需要做显式的强制转换,否则编译无法通过。

3、慎用char,一般用char的地方都用uint8代替。因为char类型的符号性是不确定的,MTK 和SPR平台对char的符号性处理不一样,因此在使用当字节变量的时候,使用uint8或者int8来替代char。

3.3 8bit bmp图片使用注意事项

1、由于在编译打包过程,编译根据bmp图片的扩展名来区分8bit、16bit和24bit bmp图片,8bit的bmp图片,其扩展名不能是.bmp,我们通常修改为.bmp256,否则编译无法通过;

2、8bit bmp图片的绘制方法与16bit和24bit的图片不同,需要通过调用mrc_bmpShow来进行绘制。

3.4 bmp图片宽高注意事项

1、SDK对图片的宽度有限制,不能超过1000个像素大小,否则图片会出现加载失败,对图片的高度没有限制。

3.5 SPR平台游戏音乐使用问题

1、由于SPR平台对音乐支持不完善,游戏过程中播放音乐不流畅,因此开发者需要注意,SPR 平台游戏不需要添加音乐播放功能,游戏代码中可以通过MR_SPREADTRUM_MOD宏来区分MTK和SPR平台,当是SPR平台的时候,MR_SPREADTRUM_MOD该宏会被自动定义的。

3.6 C语言标准库函数使用问题

1、SDK中封装了常用的C语言标准库函数,例如memcpy等,详细函数可以查看 mrc_base.h里面,如果开发者需要是否其他的库函数,那么需要先联系斯凯工程师,不是随便使用SDK中没有封装的函数,否则会出现异常。

3.7 mrc_exit函数使用注意事项

1、SDK中通过调用mrc_exit函数退出游戏,当调用该函数以后,游戏不会马上退出,而是需要执行完当前函数才会退出的,因此需要在调用mrc_exit函数以后再添加return语句,举例如下:void Test(void)

{

//…

mrc_exit();

return;//这里必须调用return,否则后面的语句会继续被执行

//other

}

3.8 本地UI窗口创建使用注意事项

1、SDK提供了简单的窗口系统管理,在mrc_win.h里面,

当开发者在mrc_winNew里使用了本地UI的相关资源,那么如果想在当前窗口之上创建新的窗口,那么就不能再使用mrc_winNew来创建新窗口,必须使用mrc_platWinNew函数来创建新的窗口,否则窗口事件函数无法正常收到按键和触摸屏等事件。

四常见问题原因和解决方法

4.1 游戏中为什么会出现花屏?有什么解决方法?

1、游戏中当图片加载失败的时候,开发者如果没有对这种情况进行判断,而继续绘制图片,那么就会出现花屏现象;

2、解决花屏问题,需要查找图片加载失败的原因,通常图片加载失败的原因有如下几种:

1传入的参数错误;

2 mrp包里面不存在相应的文件;

3 内存不足;

4 图片宽度超过1000个像素大小;

因此,针对上述原因,解决方法如下:

1 检查代码,确定函数调用时候传入的参数,修改错误参数;

2 将要加载的图片打包到mrp文件里面;

3 当出现内存不足的时候,一种情况是同一时间加载到内存的图片太多了,没有足够内存了,开发者可以通过写文件,把当前的剩余内存空间大小保存下来;另外一种情况是游戏代码有问题,例如出现数组越界、释放非法指针,把内存空间搅乱了,就需要查看游戏代码了;

4 图片宽度超过限制的,只能修改图片。

4.2 游戏中为什么会出现死机和重启?有什么解决方法?

1、当游戏代码中出现死循环、内存越界、使用野指针和空指针时候,手机就会出现死机或者重启等严重异常现象;

2、死机和重启的解决方法:

1 查找代码中所有数组,确保使用过程中不会出现数组越界问题;

2 查找代码中所有malloc地方,对malloc的返回值必须进行判断,当malloc失败的时候,必须进行处理,不能简单继续执行,通常是调用mrc_exit退出游戏,并且在mrc_exit函数后面,调用return退出当前函数;

3 查找代码中所有的free的地方,free的对象必须是合法的地址;

4 查找代码中for循环,确保循环是可以退出的,不会进入死循环;

5 查找代码中所以内存操作函数,如memcpy、memset,确保调用该函数的时候,内存地址是合法的,并且长度参数没有越界;

6 查找代码中字符串操作函数,确保所操作的字符串是合法的,并且长度等参数是否合法,如strcpy、strlen、strcat、strstr等。

7 查找代码中调用mrc_readFileFromMrpEx等类似SDK需要分配内存的函数,是否对这里函数的返回值进行判断,如果此类函数调用时候,游戏还继续进行,那么可能存在使用空指针情况。

4.3 游戏中内存申请为什么失败?

1、手机上的内存空间是非常有限的,通常情况下手机可以使用的全部内存大小为650KB,当使用malloc函数分配内存时候,如果传入的参数值太大,那么系统没有足够的内存,那么就会出现申请失败;

2、当游戏当中频繁调用malloc和free函数,那么系统就可以会产生内存碎片,那么开发者再次去malloc的时候,就可能失败,因此在游戏当中应该尽量减少malloc和free的调用次数;

3、游戏当中当前可用的内存足够,如果代码中有内存越界,搅乱可用的内存布局,那么也会出现malloc失败情况。

4.4 编译的时候为什么会提示Authorization timeout?

1、提示Authorization timeout的原因如下:

a 使用了未授权的网卡,请确定当前的网卡是否是经过授权的,如果是两张网卡,只有一张是授权过的,请禁用没有授权的那张网卡;

b 请确保当前windows登录用户是授权时候的用户,如果不是,请注销当前用户,使用授权

时候的用户登录windows;

c 由于SDK的授权是有时间限制的,电脑的时间是否修改过了,如果时间修改过了,请恢复先前的时间试试看。

4.5 运行mrp文件的时候为什么会提示找不到can't find sdk key?

1、手机上运行mrp找不到key的解决方法

a 该手机是否有key文件,如果没有,那么这种情况是正常;那么请联系斯凯SDK开发主管李波,E-MAIL:mailto:libo@https://www.doczj.com/doc/8f9969576.html,,手机 135********,获取手机key文件;

b 如果该手机有key文件,请确认key文件存放的位置是否正确;

如果key文件正确,并且先前都是可以正常运行的,建议你重新开机,然后等待2-3分钟之后,再进入游戏;

2、模拟器上运行mrp找不到key的解决方法

请找到模拟器的目录,模拟器的目录通常是simulator,找到模拟器目录下的DEBUG目录,并找到config.ini文件,如下图所示:

打开改文件,将里面的manufactory和type的值都修改为sdk,如下如所示:

或者双击这个文件Config.ini然后覆盖一下。

4.6 为什么使用串口线无法抓到trace信息?

1、确定是否装好trace线驱动程序;

2、确定抓trace软件Catcher.exe中的设置是否正确,包括端口、数据库文件和Filter

设置;

3、确定手机端串口设置是否正确,按*789#进入工程模式设置;

4、当手机和trace软件都设置正确,并且串口已经处于工作状态,那么无法抓到trace信息的原因是由于游戏对cpu占用率太高了,手机操作系统打印trace的线程无法得到运行时间,那么请修改游戏中的定时器时间,修改为200ms,然后再试试。

4.7 为什么在模拟器上运行的游戏非常流畅而在手机上运

行时候速度非常慢?有什么解决方法?

1、由于PC和手机的运行环境有比较大差别,PC的CPU主频1G-2GHZ,而手机的CPU主频为50M-100MHZ,二者性能相差巨大;

2、如果游戏运行速度过慢,那么游戏的速度就需要优化,优化的思路如下:

a 游戏中加载图片和绘制需要消耗比较多的时间,需要考虑如何减少加载和绘制操作;

b 简化游戏逻辑,精简多余的绘制操作。

4.8 测试二次确认通道的时候,现在都需要等很久,30秒以上才能收到短信,上个月不会,是不是SDKv1.0.3.23有什么改变导致的?试了2张卡,一张全球通,2秒就收到短信,一张神州行,要30秒才收到,都不是错误指令。

答:这个应该是中国移动的原因,所以要Excel中可以修改等候时间,我们实际运营时会视情况修改这个等候时间长短。

4.9 积分查询时,手机出现假死的现象,如何解决?

答:在积分查询的时候,可以适当调大游戏的定时器时间。

4.10 i18n的SGL_LoadString函数,在飞航模式下会有问题。

答:把mrc_exit()提到#endif前面,或者直接删除。以下是示例代码:

“Endianness mismatch”,可能是什么问题?

答:编译SPR的lib的时候,没有加bmp_mode=spreadtrum。

4.13展讯的手机,是否需要做积分上传?

答:展讯手机的部分机型是不支持积分上传的,所以展讯版本不需要做积分上传。

4.14道具收费,发送成功以后,需要等待用户确认,还是自动返回游戏?

答:可以显示了发送结果以后,然后自动返回游戏。

4.15 mpr工程文件里的RAM值如何填写?

答:这个值是指这个游戏,运行时所需要的内存大小。例如:

TMG2_ZY2_START_GMGGZ_SPR_600K_240X320_24_5N_AL_V104_0225.mrp

指这个游戏,能够在VM内存为600K和600K以上的手机上运行。

这个值可能通过在手机上运行一遍游戏,然后看内存的峰值内存,在这个峰值内存的基本上,加上30K,然后以50K为基数,余数不到50K的,进为50K。

例如:游戏的峰值内存是540K,加上30K,为570K,则MRP包上应该标识为600K。

4.16 手机上怎么样进行调试?

答:目前手机上调试的方法主要有两种:

1、用软件抓TRACE,可参考相关的文档。

2、应用写LOG文件,在需要调试的位置,写一些相关的信息到LOG文件中。

4.17 mrc_bitmapGetScreen这个函数什么作用?会不会产生新的内存?

答:mrc_bitmapGetScreen的作用是把屏幕缓冲中的图像拷贝到指定的BMP缓冲中。BMP缓冲的内存空间必须在调用之前,先用mrc_bitmapNew分配好。所以mrc_bitmapGetScreen

一般需要额外的和屏幕缓冲相等的内存空间。

4.18 编译SPR版本时,出现“Error: L6218E: Undefined symbol main (referred from kernel.o)”的错误提示,如何处理?

答:在代码里面添加以下代码:

#ifdef MR_SPREADTRUM_MOD

int main(void)

{

return 0;

}

相关主题
文本预览
相关文档 最新文档