前言
版本:Cocos Creator 3.1
性能优化,是前端游戏开发工程师常常需要面对的问题。而对于新手而言,听到“性能优化”这个词,由于对其了解甚少,常常从一开始就被吓住了,无从下手。
羽毛希望能够从零出发,尝试将优化这件事给大家介绍一下自己的认识,给新人一点启蒙,也欢迎大佬修正、补充,合集完成后,再针对大家的意见以及问题出一篇补充文章。
什么是性能优化?
我们常遇见的性能瓶颈主要分为:
-
空间性能瓶颈
空间性能包括内存占用大小、显存占用大小,一般情况下我们面对的是内存性能的瓶颈。当内存占用过大时,往往造成程序的崩溃。
-
时间性能瓶颈
直观表现就是游戏运行卡顿。时间性能瓶颈包括CPU性能瓶颈、GPU性能瓶颈,GPU性能很强,绝大多数情况下,我们面对的时间性能瓶颈常常都是CPU性能瓶颈。
性能优化,简单来说,就是找到性能瓶颈的真正原因,并根据原因选择相应的办法解决掉性能瓶颈的一个过程。
从平衡的角度,我理解的性能优化是:剔除冗余后,对时间、空间、游戏效果的平衡。
性能优化的步骤
1.性能测量,只有可测量的性能才便于优化。确定性能问题情形,性能测试基准机型,进行性能测量,并设立优化目标。
2.分析性能并找到性能瓶颈,先从大方向确定是时间性能瓶颈还是空间性能瓶颈。
3.确定造成性能瓶颈的最主要原因,次要原因。常见原因归类:
- CPU性能瓶颈:
- drawcall
- physic
- logic
- triangle
- 内存瓶颈:
- 纹理格式尺寸及格式
- 资源加载未释放
- 对象内存泄漏
4.按照原因优先级,根据性能测量结果,依次进行优化(按照伟大的马克思主义哲学理论,先解决主要矛盾,再解决次要矛盾),直到达到优化目标。
解决主要原因,优化效果比较明显,后期优化效果和时间比降低,适可而止。
性能测量工具
基于Cocos Creator开发的游戏,我们可用的性能测量工具有很多。游戏的调试信息面板、Chorme的performance、as/xcode ide的性能检测工具等都可为我们提供内存、帧率、网络收发流量等等方面的调试信息。
羽毛今天主要跟大家介绍一下Cocos Creator的调试信息面板,作为性能优化学习的开始。
调试信息面板解读
-
Framerate(FPS)帧率
也叫每秒传输帧数(FPS:Frames Per Second),是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数;每秒钟帧数越多,所显示的动作就会越流畅,但GPU处理的数据量也会激增,可能引起卡顿。一般对于手游,我们设定游戏以60帧为目标满帧运行,当低于30帧时,则会感受到明显的卡顿。
-
Draw call
CPU和GPU是并行工作的,它们之间存在一个命令缓冲区。当CPU需要调用图形编程接口的时候就会往命令缓冲区里面增加命令,当GPU完成上一次渲染命令的时候就会继续从命令缓冲区中执行下一条命令,命令缓冲区里面的命令有很多种,而drawcall就是其中的一种。
CPU在提交drawcall的时候需要处理很多东西,如一些数据、状态、命令等,有些渲染卡顿问题就是因为GPU渲染速度比drawcall的提交速度快,可能上一次渲染完了,CPU还在计算drawcall,所以drawcall过高会造成CPU性能瓶颈。
-
Frame time(ms)
Frame time = 1/ FPS, 每一帧的时间。从技术上讲,如果我们的游戏运行预期目标是满帧60帧,每帧的最大预算为16毫秒(1000毫秒/每秒60帧≈16毫秒)。
-
Instance Count: GPU INSTANCING的数量。INSTANCING指几何体实例化:
图形API每秒能渲染的批次有限,想要渲染一片森林(有小差异的大量小物体)的话需要用到实例化。
实例化目标是使应用程序能最小化状态和纹理变化次数,并在一次图形接口调用中把同一批次的同一个三角形渲染多次,这样就能最小化花费在提交批次的CPU时间,即所谓的“一次提交,多次渲染”。在用于大批量重复物件渲染时效果显著。
当合批生效时,该数值会增大。
-
Triangle: 三角面数量,在2D游戏开发中,纹理贴图都是矩形存在的,一个矩形由两个三角形组成,所以一张纹理贴图占用两个三角面数量。在3D游戏中,模型Mesh由N个小三角面形成。
-
Game Logic(ms): 游戏逻辑耗时
-
Physics(ms): 物理引擎耗时
-
Renderer(ms): 渲染耗时
-
GFX Texture Mem(M): 纹理缓存
-
GFX Buffer Mem(M): GFX 缓存
了解以上各项信息的含义后,我们需要分析是时间性能瓶颈还是空间性能瓶颈。
-
如果每一帧的时间过高,即时间性能瓶颈,此时观察physic,logic,drawcall,triangle指标,这些指标的过高都会导致CPU性能瓶颈,抓住表现最明显的原因进行优化。
-
如果是空间性能瓶颈且是内存瓶颈,可以分析纹理内存指标,节点数量,资源加载数量、无用资源是否释放、代码中是否存在内存泄漏等情况。
- 其中纹理内存指标可以直接在调试面板信息中看出,如果纹理缓存过高,必然直接造成内存过高,造成内存性能瓶颈,引起崩溃等严重问题。
针对不同指标(drawcall、、physics、GFX Texture Men(M)、Game Logic(ms))的优化方法我们在下一篇文章中介绍。
小结
性能优化没有想象中困难,只要学会主要的性能指标信息解读及目前机型的一般承载能力,了解不同指标的常用优化方法,学会通过信息面板验证优化结果,就能解决大多数的优化需求了,至于更精细的优化,可以在实践的过程中逐步学习提升。