优化3D性能

剔除

Godot会自动执行视图视锥剔除,以防止渲染视窗外的物体.这对于发生在小范围内的游戏来说效果很好,然而在较大的关卡中,事情很快就会变得很麻烦.

遮挡剔除

比如走在一个小镇上,你可能只能看到你所在的街道上的几栋建筑,以及天空和几只飞过头顶的鸟.然而就一个天真的渲染器而言,你仍然可以看到整个小镇.它不会只渲染你前面的建筑,它会渲染那后面的街道,与那条街上的人,那后面的建筑.你很快就会遇到这样的情况:你试图渲染比可见的东西多10倍或100倍的东西.

事情并没有看上去那么糟糕,因为Z-buffer通常只允许GPU完全遮挡在前面的物体.这被称为*深度预通*,在使用GLES3渲染器时,Godot默认启用.然而,不需要的对象仍然在降低性能.

我们有可能减少渲染量的一个方法是利用遮挡.从Godot 3.3开始,Godot中没有内置的闭塞支持.然而,通过精心设计,你仍然可以获得许多优势.

例如,在我们的城市街道场景中,你可能会事先计算出,从街道``A``只能看到另外两条街道,``B``和``C``.``D``到``Z``的街道是隐藏的.为了利用遮挡的优势,你所要做的就是计算出什么时候你的观察者在街道``A``中(也许使用Godot区域),然后你就可以隐藏其他街道.

这是一个手动版本的所谓 “潜在可见集”.这是一种非常强大的技术,可以加快渲染速度.你也可以用它将物理或AI限制在局部区域,并加快这些以及渲染的速度.

注解

在某些情况下,你可能不得不调整你的关卡设计来增加更多的遮挡机会.例如,你可能需要增加更多的墙来防止玩家看得太远,这样会因为失去了遮挡机会而降低性能.

其他遮挡技术

还有其他的遮挡技术,如门户、自动PVS和基于光栅的遮挡剔除.其中一些技术可以通过附加组件获得,将来可能会在核心Godot中获得.

透明物体

Godot通过 MaterialShader 对对象进行排序以提高性能.然而,这对透明物体来说是不可能的.透明物体从后往前渲染,以便与后面的物体混合.因此, 尽量少使用透明对象 .如果一个物体有一小部分是透明的,尽量让这部分成为一个独立的表面,有自己的材质.

更多信息,请参阅 GPU optimizations 文档.

细节程度(LOD)

在某些情况下,特别是在远处,用简单的版本**代替复杂的几何图形可能是个好主意.最终用户可能看不出什么区别.考虑看看远处的大量树木.有几种策略可以替换不同距离的模型.您可以使用较低的多边形模型,或者使用透明度来模拟更复杂的几何体.

Billboards和imposters

使用透明度来处理LOD的最简单版本是广告牌.例如,你可以用一个单一的透明四边形来表示一棵树的距离.这可以是非常便宜的渲染,当然,除非前面有很多树.在这种情况下,透明度可能会开始吞噬填充率(关于填充率的更多信息,请参见 GPU优化).

另一种方法是不只渲染一棵树,而是将一些树作为一组来渲染.如果你能看到一个区域,但在游戏中不能实际接近它,这可能是特别有效的.

你可以通过预先渲染对象的不同角度的视图来制作冒牌货.或者你甚至可以更进一步,周期性地将一个物体的视图重新渲染到一个纹理上,作为一个冒牌货使用.在远处,你需要将观察者移动相当长的距离,视角才会发生显著变化.这可能是复杂的工作,但可能是值得的,这取决于你正在制作的项目类型.

使用多网格(MultiMesh)

如果必须在同一地点或附近绘制多个相同的对象,请尝试使用 MultiMesh 来代替.MultiMesh允许以很小的性能代价来绘制成千上万的对象,这使得它非常适合用于绘制羊群、草地、粒子以及其他任何有成千上万相同对象的地方.

另请参阅 :ref:`Using MultiMesh <doc_using_multimesh>`文档.

烘焙照明

对物体进行照明是最昂贵的渲染操作之一.实时光照、阴影(尤其是很多灯光)和 GI 都特别昂贵.对于低功率的移动设备来说,它们可能根本无法处理.

考虑使用烘焙照明 ,尤其是移动端,这看起来很棒,但有一个缺点,那就是它不是动态的,有时,这需要做出的权衡.

一般来说,如果几个灯光需要影响一个场景,最好使用 烘焙光照贴图 .烘焙也可以通过增加间接光的反弹来提高场景的质量.

动画和皮肤

在某些平台上,动画和顶点动画(如换肤和变形)可能非常昂贵.你可能需要大大降低动画模型的多边形数量,或者任何时候限制屏幕上的模型数量.

庞大的世界

如果您要制作大型游戏,则与小型游戏可能会有所不同.

大型的世界可能需要用碎片建立,可以在你在世界中移动时按需加载,这可以防止内存使用失控,也可以将所需的处理限制在局部区域.

在大型世界中,由于浮点错误,也可能会出现渲染和物理故障,你可能会使用一些技术,比如将世界围绕着玩家的方向(而不是相反),或者定期移动原点以保持以 Vector3(0, 0, 0) 为中心.