内存扩展的源码讲解

2012/2/15 9:24:00  人气 741    怀旧国机论坛  
希望这段源码对天枫归隐有帮助,可以利用这段代码开发一个类似于一键返回_打包版的插件,使nes模拟器能用扩展内存,因为原模拟器如果内存是650kb就会黑屏,700kb就能关掉声音玩,800kb就会正常,据此推测,绝大多数的手机不能用,可能是内存不足,而使用内存扩展恰好就可以扩展150k内存.同时我发展模拟器中也只有一个cfunctiom.ext符合插件的使用条件。
本文由逝血残歌贡献 当手机运行斯凯平台时, 内存里还存在一些区域处于闲置的区域,这些内存可以利用起来增强游戏的品质, 称为扩展内存。 当前研发状态: mtk机型上85%以上的机型可以申请到150k以上的扩展内存,随着继续的采样和研究可以进一步提升支持率。 spr平台还没有开始分析。 1. 内存检测 在启用扩展内存前, 需要对内存进行一次检测。 #include “mrc_base.h“ extern int mrc_exramdetected(void); 这个接口用来判断本手机是否已经做过内存检测。返回 mr_success 表示已经检测过, 否则没有。 内存检测会持续一定的时间(一般来说5s-10s), 所以需要做一个简单的ui来提示用户。 extern int32 mrc_exramneeddetect(int32 numbytes); 这个接口用来判断获取numbytes的扩展内存是否需要内存检测。因为某些情况下直接通过底层的接口可以申请到。 也就是说只有在 mrc_exramdetected() 返回 failed 并且 mrc_exramneeddetect() 返回true时才需要经过检测内存的步骤。代码逻辑如下: if ( mrc_exramdetected() != mr_success&&mrc_exramneeddetect() ) { 提示玩家进行内存检测. } typedef void (*mrc_exramdetect_progress_cb_t)(int ratio); // ratio的取值范围是 0-100 void mrc_exramdetect(mrc_exramdetect_progress_cb_t cb); mrc_exramdetect是一个同步函数, 当这个函数返回时,说明内存检测已经完成。 在检测过程中会调用 应用提供的cb来提供进度。 有时候ratio到了100后会重新开始检测, 导致ratio会变小。 内存检测可能会导致死机, 但是再次进入时 mrc_exramdetected() 肯定会返回 mr_success。 这些信息需要在ui上提示用户。 2. enable/disable扩展内存: 在默认的情况下, 扩展内存是不被使用的。 #include “mrc_base.h“ extern int32 mrc_exraminitex(int nbytes); 调用这个接口, sdk将尽量的准备好>= nbytes的扩展内存。 参数: nbytes -- 需要的扩展内存的大小。 单位为byte。 返回值: 可以不理会这个返回值。 用 mrc_getmemstatus接口来判断内存是否足够。 extern int32 mrc_exramrelease(void); 在mrc_exitapp()里必须调用这个接口将扩展内存释放给系统。 3. malloc和free扩展内存: 不管扩展内存是否被启用, malloc都*不*会在扩展内存分配内存 #include “mrc_base.h“ extern void* mrc_exrammalloc(int size); 这个函数分配内存的规则是: 如果扩展内存enabled, 那么先从扩展内存中分配, 如果分配失败,再从主内存里分配。 如果扩展内存没有被enabled, 或者调用 mrc_e
xraminitex()但是没有找到合适的区域, 那么这个函数的作用和malloc完全一致。所以这个函数是兼容malloc的。 extern void mrc_exramfree(void*address); 这个函数会根据所释放的地址所属的内存块进行释放。 兼容free。 extern void* mrc_exrammalloconly(int size); 只从扩展内存里分配 extern void mrc_exramfreeonly(void*address); 只在扩展内存里释放 建议将图片申请在扩展内存里。 4. mrc_pause/mrc_apppause #include “mrc_base.h“ extern int32 mrc_exramstore(void); 在有来电或者短信等事件时,需要将扩展内存归还给系统, 必须调用 mrc_exramstore()接口。 5. mrc_resume/mrc_appresume #include “mrc_base.h“ extern int32 mrc_exramload(void); 当游戏被恢复, 必须调用 mrc_exramload来恢复扩展内存的现场。 6. 获取内存使用状态 #include “mrc_base.h“ extern int mrc_getmemstatus(int * mainused, int * main*, int * ssbused, int * ssb*, int * sbasmused, int * sbasm*); 参数说明: mainused, main* 表示主内存的被使用和剩余的内存, 单位为byte。 ssbused 和 ssb* 这两个参数作废。请填写为null sbasmused 和 sbasm* 表示扩展内存被使用和剩余。 如果扩展内存没有enabled或者enabled失败, 那么将被赋值为-1. 返回值: 主内存的峰值。 这个值可以方便跟踪内存峰值。 例如可以在mrc_exitapp里调用这个函数来获取峰值。 appendix.1 示范代码 #include “mrc_base.h“ #define min_mem_requirement (800*1024) // 本游戏的最低内存要求:800k int32 mrc_init(void) { int mainused, main*, exramused, exram*; mrc_getmemstauts(&mainused,&main*, null, null, null null); if (mainused main*<min_mem_requirement) { // 主内存不够。 if (mrc_exramdetected() != mr_success&&mrc_exramneeddetect(min_mem_requirement - mainused - main*)) { 做一个ui提示玩家第一次进行游戏,需要进行内存检测, 是否继续。 return; } else { mrc_exraminitex(min_mem_requirement - mainused - main*); // 申请差额的部分。 mrc_getmemstauts(&mainused,&main*, null, null,&exramused,&exram*); if (mainused main* exramused exram*<min_mem_requirement) { // 还是不够。 进去“提示内存不足”的ui。 提示用户“内存不够”,按任意键退出。 return; } } } // 走到这个
分支, 说明内存是足够的,继续游戏的逻辑。 } int32 mrc_pause() { mrc_exramstore(); } int32 mrc_resume() { mrc_exramload(); } int32 mrc_exitapp() { mrc_exramrelease(); } // 检测内存的代码如下: static void detectprogresscb(int32 ratio) { 绘制进度条。 } // 当玩家确定了检测内存后的代码如下: { mrc_exramdetect(detectpgoresscb); }

.
无法显示








发表回复

   


  通知楼主

地板

绝 版 ㊣ 太.02-15 12:49
看帖回帖是美德!

回复只看TA

椅子

☆绝情轩★挥手♂.02-15 09:47
看帖回帖是美德!

回复只看TA