介绍
在制作游戏时,我们经常忽略游戏开发最重要的方面之一-优化。结果,我们会出现滞后和较低的FPS(如果一切正常,有时甚至在高端设备上)。大多数人总是将游戏优化视为最后一步,这是第一个错误-它应该始终是列表中的第一项。
每天添加新的机械师或新的照明设置,或者在游戏中添加任何基于物理的系统时,都不可能高估每个构建的习惯,因此请始终检查构建以查看是否存在由于这些原因而导致的性能问题。改变是好的游戏开发实践。
如果您没有从项目开始就花时间优化性能,最终可能会给您和您的游戏带来麻烦。在这里,我想分享一些想法和技巧,这些经验和技巧是基于过去5年中我从错误中汲取的一些实践经验来提高游戏性能的。
剖析您的游戏
Profiler是列表中的第一个,也是我在Unity中最喜欢的工具之一,用于监视游戏性能以查看真正引起性能问题的原因。对于深入了解您的游戏对编辑器中各种更改的反应非常有用。
您可以在窗口->分析->探查器中找到探查器。
它显示CPU和GPU使用率,渲染,物理,音频等类别。我们不能依靠编辑器中的分析(编辑器分析),因为编辑器会在测试过程中影响项目的性能,并且这可能会影响分析信息的有效性。最好创建一个单独的构建以获取准确的性能分析数据。
远程分析
要使其正常工作,您需要安装Android SDK并连接JDK和USB调试。请记住,测试游戏在性能,UI缩放等方面的表现始终是一个好主意,更不用说同时测试真实的游戏性能了。要测试游戏的实际性能,您需要创建一个自定义配置文件。
要连接Remote Profiler,请转到“编辑”>“项目设置”>“编辑器”,然后在“设备”部分中选择“任何Android设备”。
分析构建
为确保Unity可以访问可进行概要分析的构建,必须在创建设置之前在构建设置中启用“开发构建或深度分析支持”和“自动连接分析器”。这使Unity编辑器可以自动链接您的构建。
准备好出价后,无需关闭Unity Profiler窗口即可打开游戏。现在,Unity将在探查器窗口中自动显示游戏当前版本的性能数据。
您可以在此处找到有关探查器的更多信息。
批处理游戏对象
批处理是一种非常好的技术,可以通过减少Draw调用次数来提高性能,该调用将多个相似GameObjects的渲染分组在一个draw调用中。批处理方法有两种:静态和动态。批处理存在一些限制-我们无法批处理蒙皮的网格,织物和某些渲染组件。
静态批处理
只要GameObjects是静态的,就使用静态批处理。此类静态GameObject不得移动,缩放或旋转,并且必须对所有静态GameObject使用相同的材质才能进行批处理。
如果您的GameObjects不与您的Player交互,或者您没有更改Transform,则最好对游戏中的大多数环境(例如建筑物,道路等)使用静态批处理。
动态批量
动态批处理与静态批处理类似,因为GameObjects必须使用相同的材质,但是可以对移动的对象进行分组,而不必使其变为静态。基本上,如果Unity使用相同的材质,则它们可以自动将GameObjects加载到相同的绘制调用中,但是根据Unity,它们具有一些动态批处理限制:
- 批处理动态GameObjects每个顶点具有一定的开销,因此批处理仅应用于不超过300个顶点且不超过900个顶点属性的网格。
- Shader Vertex Position, Normal UV, 300 , Shader Vertex Position, Normal, UV0, UV1 Tangent, 180 .
- : .
- GameObject- , transform (, GameObject A +1 GameObject B –1 ).
- Material , GameObject- , . Shadow Caster.
- : / . , GameObject- .
- Multi-pass .
- Unity , . « » .
- Legacy Deferred ( ) , GameObject .
动态批处理对粒子系统,渲染线和轨迹渲染的作用与对网格的作用不同。
- 对于每种兼容的渲染器类型,Unity会将所有批处理内容收集到1个大的顶点缓冲区中。
- 渲染器设置批处理材料的状态。
- Unity将顶点缓冲区与图形设备相关联。
- 对于批处理中的每个渲染器,Unity更新“顶点缓冲区”中的偏移量,然后发送一个新的绘制调用。
还有其他方法可以使用Assetstore中的某些资产来改善批处理,例如Simple Mesh Combine,Bakery,或者我们也可以使用
Mesh.CombineMeshes
将多个网格合并为一个网格,这是优化性能的理想选择。
烤灯
粗略地说,共有三种照明模式:实时,烘焙和混合。
实时是您必须为性能付出的最佳选择。它将直射光引入场景中,并在场景中的灯光和游戏对象移动时更新每一帧,并立即更新灯光。
每当您可以选择在舞台上烘烤灯光时,请务必使用它,因为它是提高生产率的理想选择,尤其是当您瞄准移动设备时。始终最好在舞台上使用弱光以获得理想的外观。
这样,您所有的灯光将在称为“光照贴图烘焙”的过程中离线进行预先计算。当您设置GameObject Lightmap静态标志时,Unity会将有关GameObject Light,阴影,反弹光和柔和阴影的信息烘焙到可以触及场景的纹理中。但是,光照贴图有一些限制,对于使用光照贴图静态标记选择的对象,光照不能动态更新。
几个月前,我在业余时间制作了一个SCIFI场景,我认为这是烘焙照明如何工作的最好例子。当然,我使用了Emission。
如果有人对SCIFI场景的创建方式以及我如何实现此外观的概述感兴趣,请告诉我,也许我可以为此撰写另一篇文章。
, !
这是通过Unity遮挡改善游戏性能的一种很好的方法。通常,“遮挡剔除”意味着Unity不会显示从摄像机角度完全被其他GameObject隐藏(遮挡)的GameObject。
要打开“遮挡”窗口,请依次单击“窗口”->“渲染”->“遮挡剔除”
。
如果您有兴趣,请看以下视频!
twitter.com/i/status/1096336962259021824
默认情况下,Unity应用“视锥体剔除”,这意味着它仅显示相机的视线,并显示所有对象。例如,如果摄像机正在看一堵墙,则该墙后面的所有对象也将被渲染。我们根本不需要它,因此我们需要将“遮挡剔除”添加到场景中。
这就是为什么我们必须使用“遮挡剔除”(Occlusion Culling)的原因,这意味着相机将只渲染没有任何物体的墙。
阅读更多: