【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吧,
- 【cocos2dx+Lua】如何降低游戏的内存开销
- 降低 lua gc 的开销
- 降低 Linux 内存开销
- 降低 Linux 内存开销
- 降低 Linux 内存开销
- 【cocos2dx+Lua】如何降低包体大小
- cocos2dx之如何减少纹理所占内存开销
- 降低 Linux 内存开销(转贴收藏)
- 降低管理开销的好方法--差分链表
- [Unity3D]降低向Shader中传值的开销
- cocos2dx lua 游戏状态机
- 如何降低App的待机内存
- LUA 打印的性能开销
- 【lua-cocos2dx游戏开发】Lua查找表元素过程(元表、__index方法是如何工作的)
- 【lua-cocos2dx游戏开发】Lua查找表元素过程(元表、__index方法是如何工作的)
- HQL或SQL使用?带来的好处:减少SQL解析时间、降低内存开销、防止SQL注入
- cocos2dx-lua制作游戏五维图
- 降低Java垃圾回收开销的5条建议
- FFmpeg For Android (一) 在Windows7下安装Ubuntu虚拟系统
- php中empty()和isset()之间的区别
- sourceinsight tab 空格 对齐 等宽字体
- 数据冗余(shù jù rǒng yú)
- Mybatis + log4j2 Debug 模式打印sql语句
- 【cocos2dx+Lua】如何降低游戏的内存开销
- Hadoop研究综述
- studio 的一些必要配置
- 线性同余发生器-随机数
- J2EE中getParameter与getAttribute以及EL表达式${requestScope}和${param[]}
- solr简介
- 欢迎使用CSDN-markdown编辑器
- Linux用户切换
- Spark研究综述