如何对游戏性能优化
英文原文:https://www.scirra.com/manual/134/performance-tips 翻译:白羊 (翻译自C2官网 Overview>Performance Tips 条目)
Mobile/手机端
现代台式电脑功能强大。一般来说,性能的主要问题是得让你的游戏在手机和平板电脑上运行良好。在这些设备上获得更好的性能是比较困难的,因为它们通常具有更弱的硬件:较慢的CPU、较慢的图形芯片和更少的内存——通常比台式计算机高10倍以上。
你必须从一开始就在手机上进行测试。由于你的电脑可能比你的移动设备快十倍多,你可能会无意中设计一个游戏,直到后来才发现它在移动设备上运行的 并不是希望中那样好。为了避免意外,定期测试预期的设备,以确保它仍然运行得足够快。 The Preview on LAN 可以使这个快捷方便。您应该致力于为移动设备设计更简单的游戏,以满足它们较低的速度和资源。
以下提示可以帮助您优化游戏的性能,以便于良好地运行在移动端上:
- 确保 WebGL 是开启的 ,为在支持WebGl的设备上,通常能显著地提高性能。
- 避免使用过多的物体或微粒, 由于移动设备对桌面计算机可以处理的限制较低。
- 在同一层上使用相同的混合模式或效果放置对象。 例如,如果你有很多物体使用添加(add)的混合模式(通常用于爆炸、激光和其他效果),请确保所有这些物体都放置在它们自己的层上。如果在运行时生成或创建对象,请确保它们是在该层上创建的。因为在效果之间切换会降低性能,这样做将确保同时使用相同效果的所有对象都被绘制。这在博客文章中有更详细的描述。 How the Construct 2 WebGL renderer works.
- 避免大面积透明的物体。透明像素仍然占用渲染的时间,即使它们没有视觉上的显示。清除图像中被浪费的透明区域. (动画编辑器中点击Shift+裁切,会批量去除多余的透明区域) 将大的透明对象分割成一系列较小的对象,还可以提高渲染性能并节省内存。例如,在屏幕边缘添加一个屏幕大小的透明边框,加上边框大小的透明边框,效果会很差,因为它仍然需要在中间填充一个大的透明区域;将它分割成四个单独的对象,对于每个边都要有效得多。
- 避免对象之间的大面积重叠。渲染是从后到前的渲染方式, 如果对象有很多重叠,重叠区域的像素会被重复渲染N次。移动GPU的内存可能很快就被占用满了。
- 如果你有不透明的背景,在项目属性中设置Clear background为NO。这避免了在每帧清除屏幕的时候,把不透明的背景也清除掉。
Common causes of poor performance/性能不佳的常见原因
对于造成游戏运行缓慢,我们整理了个清单。这份清单并非详尽无遗。可能还有其他原因导致你的游戏运行缓慢,没有列出在这里。
No hardware acceleration/没有硬件加速
通常Canvas 2D渲染较慢,是因为硬件的GPU加速问题(图形处理单元)。然而,一些设备已经不稳定的图形驱动程序和浏览器制造商通过关闭GPU来避免事故(简称“GPU黑名单”)。所以在非常老的设备上,GPU加速可能根本不受支持。关于更多信息,识别GPU黑名单在Chrome下查看。
Changing Text objects every tick/每个tick 更改文本对象
每个tick更改文本对象的大小或文本-甚至仅仅是动画或转换——可能让性能下降,尤其是在移动设备上。如果文本对象很大,问题就更严重了。只要对象没有改变,文本渲染还是非常快的,但在改变对象时必须要做一个耗费性能的重绘文字和缓存纹理的置换操作。所以要尽量使用不经常变动的小文本对象。如果必须定期更改文本,请考虑使用Sprite Font 代替, 它比普通的text渲染更快,即使每个tick改变影响也不大。
Inappropriate usage of the Tilemap object/tilemap对象的不当使用
不恰当的使用tilemap对象来显示大图片。使用tilemap对象绘制瓷砖,如果用相同的瓷砖的情况下是可以优化性能。这是在博客文章中Tilemap tidbits.有描述的。如果你贴一个大的图像在tilemap对象里,然后用tilemap对象来显示大图像,而且每个瓷砖都是不同的。这种情况下,不可能进行优化,系统必须为每个瓦片都调用出draw call命名。如果图像需要瓷砖10x10网格显示,那么它将需要调用100次的重绘命令。相比之下,一个单独的精灵或平铺背景只需要一次draw call。因此这类图像使用tilemap对象比使用一个独立的sprite对象会降低百倍甚至千倍的效率。所以Tilemap对象只适用于以网格地图为基础的游戏,Tilemap设计出来就是将单一的瓷砖重复利用多次,而不是把一个更大的图像拼起来。
Too many objects using Physics/太多使用物理行为的对象
物理行为 Physics behavior非常耗费CPU资源. 使用太多具有物理行为的物体,会导致游戏掉帧。你在设计游戏的时候,重要的对象可以用物理行为,其他没必要的小对象尽量就不要使用。
Creating too many objects/创建太多的对象
尽管现代计算机速度很快,但它们的处理能力仍然有限。创建超过1000个对象可能会导致你的游戏慢下来。尽量设计你的游戏,少用物品。系统表达式objectcount可以告诉你有多少对象正在使用。
Using too many effects/使用太多的特效
效果(Effects)在视觉上令人印象深刻,但如果使用过度,则会减慢游戏的性能,尤其是在移动端。对每个对象独立使用effects性能消耗大——通常将所有具有效果的对象放在它们自己的层上更有效,然后将效果应用于该层。这使得effects会一次性处理所有东西,而不是一遍又一遍去处理那些小的对象。有些效果也比其他的效果消耗资源更大:
模糊和发光往往是最慢的(blurs and glows tend),有中等影响的是失真效果(color blends),其中颜色混合(multiply and screen)是GPU最容易处理的。
Unnecessary use of effects/不必要的使用效果
不要使用效果来处理对象的静态效果。例如,不要使用“灰度”效果使对象始终出现灰度级。您只需将灰度图像导入对象,而不使用任何效果,这将降低性能。
Using too many particles/使用太多的粒子
粒子对象( Particles object)可以轻易创建数百个粒子。每个粒子都像一个精灵,所以它可以很快消耗掉可用的处理能力。如果可能的话,避免使用几百粒粒子——通常你可以设定的粒子速率越低越好。使用particlecount表达式来帮助你统计创造了多少粒子。
Using Sprites instead of Tiled Backgrounds/使用精灵代替平铺背景
创建对象太多会导致速度变慢,一个常见的错误是用 精灵对象(Sprite objects)来铺满网格而不是平铺背景对象(Tiled Background objects.)。这是类似于使用tilemaps不当。例如,一个精灵要创建20x20网格需要有400个对象,这显著影响到了对象数量。一个平铺的背景可以代替用精灵平铺的网格,它仅仅是一个单一的对象。平铺的背景有专门优化的重复结构,在这种情况下,它实际上是比精灵平铺的网格的效率高400倍以上。所以尽量使用平铺的背景而不是重复使用精灵。
Not placing all used objects in the layout/不将所有使用过的对象放置在布局中
如果对象不是放置在布局中,而是由事件创建的,那么C2将在创建对象时为这些对象加载纹理。这会导致一个短暂的停顿或“jank”,让游戏感觉不到响应。在布局中放置所有已使用的对象可以避免这种情况。他们可以被放置在屏幕上,并在创建地图时销毁,以避免干扰游戏。然后C2将在布局开始的时候就会加载好所有对象的纹理,避免对象在runtime创建和销毁时出现“jank”的情况。
注:Jank 大概是形容突然闪现出来的情况
Using too many loops/使用太多循环
这是罕见的,但使用太多的循环,如,For, For Each and Repeat,可能会导致游戏慢下来。嵌套循环特别有可能导致这种情况。要测试这是否是问题,请尝试暂时禁用循环事件。
Common misconceptions/常见的误解
下面的事情常常被人们指责会影响性能(如,帧率运行时),但可能有很少或根本没有影响:
1.未显示在屏幕的对象(Off-screen objects)。构建2不发出对窗口中不出现的对象的调用,而GPU也非常聪明地知道不呈现任何出现在窗口之外的内容,即使只有部分图像在屏幕上也一样。
2.图像格式(e.g. JPEG, PNG-8, PNG-32) 只影响下载大小,但对runtime性能或内存使用没有影响(它们都在启动时解压缩到32位位图)。音频格式也只影响下载大小,但对运行时性能没有影响。
3.如果没有effects的前提下,图层数量通常不会影响性能, 除非大部分的图层都改变了它们的透明度, 应用效果,或者除Normal之外的混合模式,或者 使用了 “独立纹理”(force own texture). 但是通常情况来说,增加默认设置的多个图层不会对性能产生影响。
4.除了下载大小之外,布局数也不太可能有任何效果。布局大小也没有任何直接的影响;更大的布局不会使用更多的内存或者需要更多的处理,除非您使用了更多的对象。
5. 精灵 或者 平铺背景 的角度和透明度 以及 浮点数的坐标形式(e.g. 一个精灵的坐标是 X = 10.5),一般都不会影响性能的, 因为现代的计算机芯片在处理浮点数方面是非常强的,甚至在手机也一样。不过尺寸非常大的精灵在移动设备可能会变慢,但是在桌面端他们仍然可以像小尺寸的精灵反应一样快。
More advice /更多的建议
有关性能的更多信息和建议,请参见博客文章。Optimisation: don't waste your time. 还有一些有用的技巧可以让你的游戏事件高效率运行,详情参考 博客文章Common mis-used events and gotchas.
Measuring and testing performance/测试性能
从你的项目开始你应该使用一个FPS(帧率)和监视性能,尤其是经常在移动设备上测试。这使您可以注意到,如果你添加了一些炫酷的效果,会对游戏的性能造成怎样的影响,尤其是在移动端上。
尽可能多地在设备和浏览器上测试项目。
如果你想在你的项目引起的性能问题,测试的理论通常是容易的:备份您的项目,删除有问题的东西,看看帧率提高了。如果它改进了,你删除的是原因;如果不是,那一定是别的什么东西。也可以使用 debugger功能查看游戏中某个事件表占用了过多的CPU资源。
Always measure performance.(始终测试性能) 计算机系统是高度复杂的,在性能方面有许多意想不到的或相反直觉的结果。要知道某物对性能有什么影响,唯一的方法就是测量它。如果不能测量差异,则可能对性能没有严重影响。
How to measure performance/如何测试性能
查看游戏中哪些部分使用多少CPU资源的最佳方法是查看调试器的分析器选项卡。 (Profiler tab of the debugger) 如果游戏的瓶颈在CPU的逻辑而不是GPU渲染,那么这应该帮助你快速识别项目的一部分,是占用CPU线程最多的。
这里有三个系统表达式( system expressions) 这对指示性能也很重要
fps -每秒返回当前帧数。通常最高速度是每秒60帧,但它可以根据系统而变化。
cpuutilisation -返回当前JavaScript线程的估计使用率。这是使用JavaScript处理可用CPU资源的一个近似值。它的范围从0到1,所以表达式(cpuutilisation×100)将返回一个百分比。这个表达式不会报告整个系统CPU的使用情况,所以它可能是不准确的,因为它是由JavaScript中的定时测量所作的估计,所以不要过于依赖它。
renderer -返回canvas2d或WebGL在使用不同的渲染器。WebGL渲染器通常比canvas2d明显要快,但也要看浏览器是否支持它,还有你的GPU并没有被列入到浏览器的黑名单里。有关更多信息,请参见技术部分。
你可以用一个文本对象在游戏中创建这些值的显示,以便在测试游戏时关注性能,每个tick都使用一个动作更新它:
Set text to fps & " FPS, " & round(cpuutilisation * 100) & "% CPU (" & renderer & ")"
这将显示一个字符串 60 FPS, 30% CPU (webgl) 显示帧率,近似的CPU占比和渲染模式。
Identifying GPU blacklisting in Chrome/识别GPU黑名单
性能不佳的最常见原因之一是由于不稳定的驱动程序,GPU支持被关闭。这导致游戏恢复到软件渲染,这会削弱低端设备的性能。谷歌浏览器浏览器提供了一些诊断程序,可以在Windows、Mac、Linux和Android设备上检查这一点。Hardware acceleration status/硬件加速的状态
要查看哪些硬件加速了硬件特性,请访问chrome://gpu通过地址栏。图形特征的状态下,你应该能够看到是否是Canvas(canvas2d渲染)和WebGL硬件加速。应该说有硬件加速状态应该是绿色的。否则只能是软件或类似的关于硬件加速被禁用的情况,就会出现橙色或红色的信息。
有硬件加速的WebGL将提供最佳的性能。如果WebGL没有硬件加速但有使用Canvas,性能应该还是不错的。否则即使是硬件加速了,性能也很差。
注意浏览器制造商也有他们的硬件黑名单。仅仅因为Chrome没有使用硬件加速,就认为其他浏览器不会使用是不行的。如果能够使用GPU加速,切换到Firefox浏览器这样的替代方案可以提供更好的性能。
Forcing hardware acceleration enabled/强制启用硬件加速
如果设备不能使用硬件加速,则有可能强制它发挥出硬件设备的全部性能。然而值得注意的是,这是浏览器制造商把这些硬件设备加入黑名单的好理由,因为这种方式容易导致崩溃,挂起,甚至设备死机(这在移动意味着你必须拆卸和更换电池重置)。
要强制在Chrome中启用硬件加速,请通过地址栏访问chrome://flags 顶部应该是一个名为重写软件呈现列表(Override software rendering list)的项目。请注意,直到你按下重启按钮您的更改才会生效
重新启动后,设备应能充分利用GPU加速,包括WebGL支持。这允许您测试设备的实际硬件功能,而不会因为黑名单而表现不佳。
这篇文章真的特别棒!把我们踩的坑都总结下来了