cocos2dx性能优化

游戏性能应该在设计编码时就需要认真对待,在按照常规处理之后需要使用工具查找游戏性能瓶颈,之后针对处理.

主要的性能问题所在基本是GPU,CPU.经常涉及到游戏逻辑优化,优化效果的指标:帧率、内存、drawcall.

查找 GPU 性能瓶颈的工具
  1. 使用 Xcode OpenGL ES Profiler。

    文档链接地址

    如果你想 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

使用工具查看图形渲染管线哪个阶段遇到瓶颈了,是顶点处理阶段,还是像素着色阶段。

查找 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. Cocos Creator 的用户,可以使用 Chrome 自带的 timeline 工具和 CPU profile 工具。

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

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

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

如果你知道这些内容,那么你就可以避免一些常见的性能瓶颈。

常见的优化技巧
  1. 对于资源在能满足效果的前提下需要使用省资源和计算的方式实现

    例如像素格式为RGBA4444可以达到效果就不要使用RGBA8888;不带通道的图片使用jpg而非png;使用压缩纹理和多级纹理;声音可以采纳较低采样率和单通道;使用九宫图等

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

  • 降低你的游戏的 Draw call 数量,最大限度地利用批次渲染来减少 Draw call 数量。 Cocos2d-x 3.x 包含了自动批处理功能,但是它需要你合图,并且生成的图形渲染命令必须相邻,且有相同的 material id。
  • 对于游戏中出现的大量对象,可以使用对象缓存池来避免对象生成的消耗的时间
  • 对于外部资源例如纹理声音文字等,尽量采用预加载避免游戏循环中出现大量IO操作
  • 对于复杂UI的实现如listview等,里面重复的item可以使用clone的方法
  • 避免在游戏循环做复杂运算,对于系统更新可以分系统选择不同的更新频率,特别是AI有些事不用每帧更新。
  1. GPU 瓶颈通常局限于Overdraw和 Bandwidth

    Overdraw 这个问题会导致你的 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

cocos2dx优化方案
  1. 尽可能地使用批次渲染(Batch Draw)
  2. 控制Draw 数量尽量少
  3. 减少 32 位未压缩纹理的使用,尽量使用 16 位且压缩过的纹理格式。
  4. 尽可能地使用支持硬件解码的压缩纹理:比如 iOS 平台使用 PVRTC 纹理, 在安卓平台上面使用 ETC格式的纹理。
  5. 请使用对象缓存池和预加载技术来避免临时创建耗时导致卡顿。
  6. 使用 armeabi-v7a 架构来编译 Android 的 SO,因为在此架构下面 Cocos2d-x 会启用 neon 指令集,矩阵运算的效率会大大提高。
  7. 避免在 pixel shader 里面做非常复杂的计算
  8. 避免在 pixel shader 里面使用 discard 和 alpha test,因为这样会破坏 GPU 自身的 depth testing 优化,比如 PowerVR 的 HSR。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值