cocos2dx内存优化

什么消耗了90%的内存?
是纹理(textures)
优化方案:
1).cocos2d里面纹理加载分为两个阶段:1.从图片文件中创建一个UIImage对象。2.以这个创建好的UIImage对象来创建CCTexture2D对象。这意味着,当一 个纹理被加载的时候,在短时候内,它会消耗两倍于它本身内存占用的内存大小。(译注:为什么只是短时间内呢?因为autoRelease pool和引用计数的关系,临时创建的UIImage对象会被回收。)
2).不要使用JPG图片!
3).最快速地减少纹理内存占用的办法就是把它们作为16位颜色深度的纹理来加载。cocos2d默认的纹理像素格式是32位颜色深度。如果把颜色深度减半,那么 内存消耗也就可以减少一半。并且这还会带来渲染效率的提升,大约提高10%。
你可以使用CCTexture2D对象的类方法setDefaultAlphaPixelFormat来更改默认的纹理像素格式
4).TexturePacker PNG 图片优化
5).减少声音文件大小
载入纹理时按照从大到小的顺序,并且分帧加载。
1.载入纹理时按照从大到小的顺序,并且分帧加载
2.资源格式的选择。主要有3个因素会影响纹理内存,即纹理格式(压缩还是非压缩)、颜色深度和大小。
推荐纹理格式为pvr.ccz,16位颜色深度
3.减少绘制调用和上传gpu压力。控制避免有较大的纹理一次上传到显存中,尽量将散图打到一张整图中,一般情况下每帧上传一张1024*1024的rgba8888格式的纹理是不 会出现卡顿的
4.降低UI复杂度。
5.UI设计的时候要提高UI通用资源的使用率。
6.动画文件的处理。动画一般有两种选择,帧动画和骨骼动画。
帧动画的优点就是运算不耗性能,并且表现较好,缺点就是当帧数较多时,资源量比较大,并且占用内存较高,所以不太适合做过于复杂的动画
骨骼动画的特点就是节省资源,一套骨骼可以做很多套动作,新增动作也不会对文件大小有明显的增加,缺点也比较明显,就是因为骨骼动画是通过计算,然后进 行旋转,位移等实现的,所以当动画比较复杂,骨骼数量较多时,计算量就会很大,对CPU的计算增加了压力,压力过大时就会掉帧卡顿。
7.游戏音效的规格及优化。背景音乐文件大小应该低于800KB,最简单的方法就是减少背景音乐时间然后重复播放。音频文件采样率大约在96-128kbps为佳,比特率44k Hz就够了。
8.游戏逻辑的相关优化。在代码中,不要在主循环中做复杂的逻辑处理,例如for循环更新、查找等,可以利用缓冲等技术,解决和优化在主循环中每帧的效能。
9.代码级别的优化。这点比较简单,在编写程序时,算法最优,并且不要有内存泄漏等。

获取游戏内存使用的一些有用的信息。
CCTextureCache::sharedTextureCache()->dumpCachedTextureInfo();
Director::getInstance()->getTextureCache()->removeUnusedTextures();
Director::getInstance()->getTextureCache()->removeTextureForKey(“Images/grossinis_sister2.png”)
Director::getInstance()->getTextureCache()->removeAllTextures();

释放资源的代码
CCAnimationCache::purgeSharedAnimationCache();
SpriteFrameCache::getInstance()->removeUnusedSpriteFrame();
CCTextureCache::getInstance()->removeUnusedTextures();
CCTextureCache::getInstance()->getCachedTextureInfo();
在onEnterTransitionDidFinish 执行后过一段时间,再调用释放资源的方法,这样就可以确保资源被释放。
{
void onEnterTransitionDidFinish(){
scheduleOnce(CC_SCHEDULE_SELECTOR(SceneB::release), 2.0f);
}
void release()
{
CCAnimationCache::purgeSharedAnimationCache();
SpriteFrameCache::getInstance()->removeUnusedSpriteFrame();
CCTextureCache::getInstance()->removeUnusedTextures();
CCTextureCache::getInstance()->getCachedTextureInfo();
}
}
释放上一个场景所有资源用的是以下代码:
{
// 释放场景对象自己
scene->removeFromParentAndCleanup(true);
// 清理GUI管理类(这个不要放到最后清理)
GUIReader::getInstance()->destroyInstance();
// 清理场景管理(所有读取的场景都会被清理掉)
SceneReader::getInstance()->destroyInstance();
// 清理动作(这里指Action动作,不是动作编辑器的动作。)
Director::getInstance()->getActionManager()->removeAllActions();
// 清除动画数据
ArmatureDataManager::getInstance()->destroyInstance();
// 清理数据管理
DictionaryHelper::getInstance()->destroyInstance();
// 清理精灵帧
SpriteFrameCache::getInstance()->destroyInstance();
// 清理纹理
Director::getInstance()->getTextureCache()->removeAllTextures();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值