【cocos2dx+Lua】如何降低游戏的内存开销

来源:互联网 发布:matlab 三维数组插值 编辑:程序博客网 时间:2024/06/05 03:45

游戏开发中,可能最需要注意的方面就是游戏的内存了,其他方面,比如CPU开销,渲染速度啊,包体大小啊,都很重要,但是游戏内存过大会死机啊,所以还是这个最重要。


之前在一家棋牌公司,他们之前的一个棋牌项目,老死机,我一检查才发现,居然峰值内存到400M以上尴尬。一个棋牌游戏,至于吗,iphone6以下跑不动。然后我就开始接手修复,经过一周左右的修改,成功将峰值内存降到120M左右。我做了哪些工作呢?


一、整体规划了游戏内的资源

我发现游戏资源中,有很多相同的资源,在不同的plist中。这是很大的资源浪费,所以我重新合成了plist图片,基本合图的规则是,同一个页面的图,放到一个plist中,公用的图,单独整理成一个plist文件。这样,在一个页面中,我们只需要加载一张公用的plist,和这个页面自己的plist就OK了。

另外,可能的情况下,尽量使用九宫格和拼图来做背景和大量的框体,比一张整体省内存省太多了。


二、.plist和散图的合理使用

大量使用TP来合并散图应该是业内的共识了,可以降低内存开销,可以提高渲染速度。但是也有一些图不应该被合并到plist中的。

1、jpg格式的背景图:首先,背景图很大,放到plist中,会撑大图片,而且被转到png,也会增加包体大小。最关键的时候,如果单独放,我可以在恰当的时候,从内存中删除这张图片。

2、大量的同类型图片:比如头像,游戏中可能有30种不同的头像供玩家选择,实际上,玩家大部分情况下,只会显示一张头像。如果将此30张图都合并到plist中,另外29张带来的内存开销就是不必要的。


三、用TP合图,而不用cocoStudio的合图

两者比较,TP的算法更加的科学,而且TP支持很多参数是必须的。

1、Allow free sizes:不用完全遵从2的幂次的规则,最新的cocos2dx可以支持这种格式,并且按照真实的尺寸来分配内存。

2、RGBA4444:16位图。加载这种图的时候,比正常的RGBA8888可节省一半的内存开销。当然,这是一种有损的压缩,最好配合线性抖动来使用,TP中选择Linear。然后请你们的美术来看看,能否接受。

PS:上次去面试的时候,一个CTO问了我很多很多问题,其中也有内存开销降低的问题,我提出用RGBA4444来替换RGBA8888,可降低一半的内存开销,他居然说不对,不会降低内存。尴尬当然,我也没面试上,我觉得他们需要的技术研究者而不是开发者。我认为自己还是适合做项目而不是做研究。


四、合适的时候,清理下不用的纹理

cocos2dx会保留每一个你加载的资源纹理,除非你手动去删除它,这样的好处是,如果都加载完了,切换界面会很流程,因为没有内存开销吗。坏处是,对于现在的游戏,资源会很多,很容易就把内存给堆爆了。

那么就需要清理不用纹理,cocos2dx在内存警告的时候,自己会调用下此函数。但是我告诉你,这不是一个好事,因为你不知道什么时候,这个机制会触发,如果在此之前,你加载了一个动画特效,但是并没有将其加入场景,当触发此机制时,特效资源被清除了,而你不知道,一旦你要用到这张图,crash!

手动调用最为安全,当然,要结合我之前说的调整,一个页面的资源一张图,那么其他页面的资源就可以被清除出去了,内存就干净了。

这是LUA代码,清除不同的纹理:

spriteFrameCache:removeUnusedSpriteFrames()
 textureCache:removeUnusedTextures()

当然,你也可以手动指定清除一张图,比如刚才页面不用的背景

spriteFrameCache:removeSpriteFramesFromFile(dataFilename)

我一般会在一个大内存开销的起始位置和结束位置做这些工作,比如进入游戏前,退出游戏后。


五、扫一扫音乐文件

音乐文件一般占用内存不太多,可以通过降低音乐的比特率等方式来降低一些内存。3-5M吧,


0 0
原创粉丝点击