游戏性能

优化 Cocos2d-x 游戏性能html

    2016-07-24  html5

     ios

Table of Contents

这篇文章从理论的角度和你们一块儿来探讨一下如何优化 Cocos2d-x 游戏的性能,这里面提供的优化技巧并不局限于使用 Cocos2d-x 引擎制做的游戏,也适用于其它任何引擎制做的游戏。

Golden rules

查找游戏性能瓶颈,而后优化瓶颈

当咱们在作任何性能优化以前,请牢记这条。形成你的系统性能瓶颈的代码一般只有那 20%的代码,切莫胡乱优化。

老是使用工具来查找性能瓶颈,而不是靠猜

目前社区里有许多工具能够用来查找图形应用的性能问题。

查找 GPU 性能瓶颈的工具

  1. 使用 Xcode OpenGL ES Profiler。

    文档连接地址: https://github.com/rstrahl/rudistrahl.me/blob/master/entries/Debugging-OpenGL-ES-With-Xcode-Profile-Tools.md

    这里是苹果官方的参考文档: https://developer.apple.com/library/ios/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/ToolsOverview/ToolsOverview.html

    若是你想 profiling 特定 GPU 的移动设备的图形性能,咱们可使用这些 GPU 制造商提供的工具:

  2. 对于 ARM Mali GPU,可使用 mali graphics debugger: http://malideveloper.arm.com/resources/tools/mali-graphics-debugger/

  3. 对于 Imagination PowerVR GPU,可使用 PVRTune: https://community.imgtec.com/developers/powervr/tools/pvrtune/

  4. 对于 Qualcomm Adreno GPU,可使用 adreno GPU profiler: https://developer.qualcomm.com/software/adreno-gpu-profiler

使用这些工具可让你更清楚地知道你的图形渲染管线哪一个阶段遇到瓶颈了,是顶点处理阶段,仍是像素着色阶段。

可是,请记住,通常你的游戏的性能问题可能并不在 GPU,而在 CPU

查找 CPU 性能瓶颈的工具

  1. Mac 平台可使用 Xcode 的 Time Profiler  工具: https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/MeasuringCPUUse.html

  2. Windows 平台可使用 Visual  Studio  的 CPU profiler: https://blogs.msdn.microsoft.com/visualstudioalm/2015/10/29/profile-your-cpu-in-the-debugger-in-visual-studio-2015/

  3. Cocos2d-html5 和 Cocos Creator 的用户,可使用 Chrome(或者 Firefox) 自带的 timeline 工具和 CPU profile 工具。

熟悉你的移动设备和你使用的游戏引擎

熟悉你的移动设备使用的 GPU 和 CPU 的型号, Android 手机能够安装一个应用“GPU-Z”能够很是方便地查看到这些信息,而到目前为止iOS 设备统一使用的都是 PowerVR 的 GPU。若是你在测试游戏的过程当中,发现其它手机都没有问题,可是某些具备同种类型的 GPU 的设备性能表现都不佳,此时你可能须要留意一下针对特定 GPU 的优化技巧了。

一样的,了解你所使用的游戏引擎的局限也是很是重要的。你须要清楚地知道你所使用的游戏引擎是如何组织图形渲染命令的,这些命令又是如何处理 Batch Draw 的。以及,咱们须要如何组织咱们的纹理和游戏节点对象,这样才能最大限度地利用引擎提供的自动批处理功能。

若是你知道这些内容,那么你就能够避免一些常见的性能瓶颈。

记住"足够好"原则

什么是“足够好“原则?若是游戏玩家的眼睛不能区分不一样质量的渲染结果,那么老是使用更省资源和计算更简单的实现方法。

咱们都知道,一张像素格式为 RGBA4444 的图片在显示的时候,显示效果确定是不如一张像素格式为 RGBA8888 的图片的。可是,若是咱们使用 RGBA4444 加上“抖动”算法,那么玩家通常是很难分辨出来的,特别是若是图片比较小,或者设备分辨率比较低的时候。

一样的原则也适用于声音,好比低采样率的声音比高采样率的声音更省内存和解码资源,若是玩家分辨不出差异,那么也要选择更低采样率的声音资源,对于单通道和双通道声音也同理。

Common Bottlenecks

按照经验来讲,通常你的游戏的性能瓶颈都是出如今 CPU 而不是 GPU 上面。

CPU  瓶颈一般跟 Draw call 数量和你的游戏循环的复杂度相关

因此,你须要尽量地下降你的游戏的 Draw call 数量,最大限度地利用批次渲染来减小 Draw call 数量。 Cocos2d-x 3.x 包含了自动批处理功能,可是它须要你合图,而且生成的图形渲染命令必须相邻,且有相同的 material id。

对于游戏中出现的大量对象,好比×××,鱼群等游戏对象,须要使用内存池技术来避免在游戏循环中产生大量的 IO 操做。同时,对于游戏中须要用到的外部资源,好比纹理图集,声音文件和 TTF 文件等,尽可能采用预先加载的方式来处理。

同时也千万要避免在游戏循环里面作很是复杂的计算,由于游戏循环每帧都会执行,因此这些耗时的操做极可能让你的游戏的 FPS大大下降。

GPU 瓶颈一般局限于 Fillrate(Overdraw) 和 Bandwidth

若是你使用 Cocos2d-x 制做 2D 游戏,你通常不会编写复杂的 Shader,因此一般你不太会遇到 GPU 相关的性能问题。

可是,Overdraw 这个问题会致使你的 GPU 很容易碰到带宽的瓶颈,从而下降你的图形性能。所谓 Overdraw,指的是在图形渲染管线中,不少像素的着色对于最终显示在屏幕上的颜色没有帮助,这些多余的计算和处理是浪费的,最重要的就是浪费带宽,由于它们须要从主存中采样纹理坐标。

尽管,现代的移动端 GPU 都有实现 TBDR(Tile-based Defered Rendering),可是只有 PowerVR的 HSR(隐藏表面剔除)能够极大地解决 Overdraw 的问题。其它的 GPU 厂商都只实现了 TBDR + Early-Z,若是你按照从前日后的顺序提交不透明几何图元给 GPU 处理,那么这些 GPU 的 Overdraw 问题也会减小。

可是,咱们知道 Cocos2d-x 引擎老是按照从后往前的顺序去提交图形渲染命令的,由于在 2D 里面,大量的图片都是带有透明像素的,为了保证 blending 的正确性,就必须保持这种顺序的渲染命令提交。即便按照这种顺序去提交渲染命令,PowerVR 的 HSR 也能够在片段着色以前剔除掉不须要计算的像素。这也是为何一样的 Cocos2d-x 游戏在很垃圾的 iPod 上面性能也不错,可是在某些 Android 旗舰机上面性能却表现得一团糟的缘由。

注意: 经过使用工具, 预先将 2D 图片三角化,能够提升 Fillrate。

具体作法能够参考 TexturePacker 做者写的文章: https://www.codeandweb.com/texturepacker/tutorials/cocos2d-x-performance-optimization

Simple checklist to make your Cocos2d-x game faster

  1. 尽量地使用批次渲染(Batch Draw)

  2. 按照经验,尽量把你的 Draw 数量控制在 50 如下

  3. 减小 32 位未压缩纹理的使用,尽可能使用 16 位且压缩过的纹理格式。

  4. 尽量地使用支持硬件解码的压缩纹理:好比 iOS 平台使用 PVRTC 纹理, 在安卓平台上面使用 ETC格式的纹理。目前全部的 Android 设备都是支持 ETC1 格式的纹理的,可是此纹理格式不支持 Alpha,因此你须要修改一下引擎以使用 ETC1 格式的纹理。

  5. 不要使用系统字体来动态显示你的游戏中的分数等信息,请使用 BMFont 字体。

  6. 请使用对象池和预加载技术来避免临时卡顿。

  7. 使用 armeabi-v7a 架构来编译 Android 的 SO,由于在此架构下面 Cocos2d-x 会启用 neon 指令集,矩阵运算的效率会大大提升。

  8. 不要使用动态光照,尽可能使用 bake 光照。

  9. 避免在 pixel shader 里面作很是复杂的计算

  10. 避免在 pixel shader 里面使用 discard 和 alpha test,由于这样会破坏 GPU 自身的 depth testing 优化,好比 PowerVR 的 HSR。

相关文章
相关标签/搜索