近期游戏准备出安卓版本,在安卓上的性能表现不佳。经过一周多的优化,在性能上取得了较大的提升。游戏采用Cocos2d-x 3.2 + Lua进行开发,以下将在渲染效率,cpu效率,包大小等方面进行总结。


渲染效率

纹理格式 – 运行效率 内存 包大小

  • 所有的图片都通过一个python脚本(调用TexturePacker的命令行工具)自动转换为RGBA4444编码的格式。然后判断当前平台为安卓时,将默认纹理格式转换为RGBA4444。

--安卓启用4444纹理
if targetPlatform == cc.PLATFORM_OS_ANDROID then
    cc.Texture2D:setDefaultAlphaPixelFormat(cc.TEXTURE2_D_PIXEL_FORMAT_RGB_A4444)
end
  • 以上的过程会发现一种比较”反常”的现象,就是转成RGBA4444的图片要比原来的图片要大。所以在脚本中不能单纯的转换,需要对比转换前后的大小,只转换变得更小的图片。

  • 还需要注意性能和表现的平衡。有些图片转成RGBA4444后看起来太糙,严重的影响了游戏的视觉体验。对此需要小心的针对处理。处理方法为,在这些纹理使用前将默认纹理格式设置为RGBA8888,然后当纹理使用后再将设置为之前的默认纹理格式。


    左图是没有做处理的游戏截图,可见相当不平滑的光线和背景。 右图是只针对背景和光晕的纹理设为RGBA8888处理,视觉体验一下子就回归了。

  • 压缩成RGBA4444格式的PNG图片,还可以用pngquant工具进一步压缩,而视觉体验肉眼感受几乎没有变化。这样可以进一步的减少包的大小。

  • RGBA4444的纹理内存使用量要比默认的RGBA8888小一半,所以可以很大的减轻游戏的内存压力。而且和PVR ETC等压缩纹理想比,可以一套代码,完全兼容iOS和Android两大移动平台。所以我认为性价比还是很高的。

纹理剪裁 – 内存 包大小

  • 游戏采用CocoStudio来制作骨骼动画。CocoStudio导出的骨骼动画导出的图片默认是POT(power of two)大小的。其实会造成很多空白像素的浪费,这些空白像素不仅会让图片变大,还会增加纹理的内存。

  • 具体办法是:将导出的POT图片,经过美术或工具的剪裁掉多余的空白像素,使之变成NPOT(non power of two),然后修改一下plist文件中<texture>中的width和height值。对实际的使用是没有任何影响的。

  • 通过把所有POT格式的图片裁剪为NPOT,不仅可以缩减图片的体积,还能减少纹理的内存占用。

DrawCall OverDraw

  • 在同事对整个包进行DrawCall和OverDraw分析后发现,消除场景内还保留着天空背景。而这层背景实际是玩家看不到,因为它完全被消除场景挡住了。但是它会带来全屏的绘制造成了全屏范围的OverDraw,而且带来了很多额外不必要的DrawCall。将其隐藏后,FPS在低端机上提升明显。

  • 需要把这些看不到的东西全部隐藏或移除掉,否则它们会造成OverDraw和不必要的DrawCall,增加了GPU的负担。

  • 隐藏的办法,有些童鞋喜欢将其透明度设为0,但是这样是不会降低DrawCall的。最好的方法是将其visble设为false。

  • 还有就是场景内有很多细碎的东西,如果它们都是一张张散图储存的话,会使DrawCall居高不下,从而可能导致FPS下降。why are draw calls expensive?

  • 解决办法就是尽可能的将经常一起出现在屏幕上的小图合并成一张大图


cpu计算

  • 避免在循环内做重复的运算。因为如果计算值在整个循环内都不会变的话,那么每次循环都去计算就是浪费cpu周期,应该将计算结果缓存在循环外部。

  • 想办法避免开销大的函数(如:开方函数,三角函数),寻找简单运算的替代方案。如:距离的比较可以不用开方先求出距离,而是直接用平方运算进行比较即可。

  • 尽可能的避免同时多个的cc.RepeatForever。在低端机上发现在对较多对象调用cc.RepeatForever时,FPS下降显著。原因可能是每帧带来的计算,和因此频繁触发的Lua GC。GC是很一个十分耗费cpu的操作。

  • 优化算法,剪枝,去除冗余的计算。在游戏内的碰撞系统是这么进行优化的:原来对每一个球,会遍历整个空间的碰撞体和墙壁进行碰撞检测;优化后的算法是取球当前的坐标,转换为格子坐标,然后取格子周边6个格子内的碰撞体和墙壁进行碰撞检测。效率提高了很多倍。

  • 避免频繁的开辟内存,对象最好实现复用。开辟内存也是一项很耗费cpu的操作,尤其是在移动设备上内存紧张时。对象能重用尽量重用(建立对象池)。Lua内的表能初始化大小,尽量先初始化大小,否则rehash的操作很费时。如何编写高性能的Lua代码?

  • 用效率更高的库来替换,比如用cJson来替换Lua json,用pugixml来替代tinyxml2。或者将效率低的模块尝试用更低级的语言进行重写。

  • 出包时,关掉所有的print语句和cclog语句。你们都知道输出到缓冲区的log有多卡。


其他

异步加载

  • 预测即将用到的纹理和资源,将其进行异步加载。这样能在用到时,减少掉纹理加载的时间,感觉上会更流畅一些。

移除不用的库

  • 由于引擎使用的是Cocos2d-x 3.2版本,所以没有3.3带来的模块精简的功能。但是我们也可以自己去小心翼翼的移除掉游戏根本不会用到的模块。比如:物理引擎,3d模块,CocosBuilder spine等等。

  • 具体的方法是:通过adt的打包日志,分析有哪些库被编译进最终的so文件中,然后去项目内一个一个搜索这些库的名称。找到其对应的Android.mk文件,然后尝试移除掉无用库文件,然后尝试编译,确保游戏能正确运行。

原文地址:http://wuzhiwei.net/opitimize_of_cocos2d-x_lua_game/

Cocos2d-x+Lua游戏的优化总结的更多相关文章

  1. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  4. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  5. Ionic – Splash Screen适用于iOS,但不适用于Android

    我有一个离子应用程序,其中使用CLI命令离子资源生成的启动画面和图标iOS版本与正在渲染的启动画面完美配合,但在Android版本中,只有在加载应用程序时才会显示白屏.我检查了config.xml文件,所有路径看起来都是正确的,生成的图像出现在相应的文件夹中.(我使用了splash.psd模板来生成它们.我错过了什么?这是config.xml文件供参考,我觉得我在这里做错了–解决方法在config.xml中添加以下键:它对我有用!

  6. ios – 无法启动iPhone模拟器

    /Library/Developer/CoreSimulator/Devices/530A44CB-5978-4926-9E91-E9DBD5BFB105/data/Containers/Bundle/Application/07612A5C-659D-4C04-ACD3-D211D2830E17/ProductName.app/ProductName然后,如果您在Xcode构建设置中选择标准体系结构并再次构建和运行,则会产生以下结果:dyld:lazysymbolbindingFailed:Symbol

  7. Xamarin iOS图像在Grid内部重叠

    heyo,所以在Xamarin我有一个使用并在其中包含一对,所有这些都包含在内.这在Xamarin.Android中看起来完全没问题,但是在Xamarin.iOS中,图像与标签重叠.我不确定它的区别是什么–为什么它在Xamarin.Android中看起来不错但在iOS中它的全部都不稳定?

  8. 在iOS上向后播放HTML5视频

    我试图在iPad上反向播放HTML5视频.HTML5元素包括一个名为playbackRate的属性,它允许以更快或更慢的速率或相反的方式播放视频.根据Apple’sdocumentation,iOS不支持此属性.通过每秒多次设置currentTime属性,可以反复播放,而无需使用playbackRate.这种方法适用于桌面Safari,但似乎在iOS设备上的搜索限制为每秒1次更新–在我的情况下太慢了.有没有办法在iOS设备上向后播放HTML5视频?解决方法iOS6Safari现在支持playbackRat

  9. 使用 Swift 语言编写 Android 应用入门

    Swift标准库可以编译安卓armv7的内核,这使得可以在安卓移动设备上执行Swift语句代码。做梦,虽然Swift编译器可以胜任在安卓设备上编译Swift代码并运行。这需要的不仅仅是用Swift标准库编写一个APP,更多的是你需要一些框架来搭建你的应用用户界面,以上这些Swift标准库不能提供。简单来说,构建在安卓设备上使用的Swiftstdlib需要libiconv和libicu。通过命令行执行以下命令:gitclonegit@github.com:SwiftAndroid/libiconv-libi

  10. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部