Godot-3D教程-02.3D性能和局限性

介绍 Introduction

Godot遵循表现与性能平衡信条。在这个表现的世界中,它们总是有许多约定俗成的东西,主要是在用执行速度换取可用性与扩展性方面。下面是一些实际的例子:

  • 高效地渲染对象是比较简单的,但是当需要渲染一个大场景的时候就会变得效率低下。为了解决这个问题,我们只把可见性对象加入到渲染线程中,尽管这样也会失去一部分效率,但是这样在同一时间需要渲染的对象减少了,也就大大的提高了整体的效率。
  • 为每一个对象设置材质属性将会使渲染变得异常缓慢。为了解决这个问题,渲染对象将按照材质进行排序以减少消耗,但是同一时间进行排序也同样有消耗。
  • 在三维物理世界中也会出现同样的情况。即使最好的算法处理大量的物理对象(如SAP),在加入/移除对象与投射时也会变得缓慢。算法允许快速的插入和移除,此外许多激活状态下的对象投射将变得不可用。 

这儿还有很多这样的例子!实际上游戏引擎在这方面目标上都是一致的,所以一个平衡的算法总是倾向于某些方面快速某些方面缓慢或者通过牺牲易用性来提升速度。

Godot也不例外,它设计了在后台可以切换不同的算法,默认优先考虑平衡性与灵活性,而不是表现方面。

有了这一点,本教程的目标就是如何使Godot释放最大能量。

渲染 Rendering

3D渲染在表现性能中将是一个十分困难的领域 ,因此本节将有一个提示列表。

在探着色器和材质 Reuse shaders and materials

Godot渲染器还是有一些不同的。它设计方面是尽可能多的减少GPU状态变化。 空间材质( SpatialMaterial) 在相似的着色器中对材质的重用方面很出色, 在使用自定义着色器时,要尽可能多的考虑到重用性。Godot的优势如下:

  • 材质重用 Reusing Materials: 场景中不同材质的数量越少,渲染的速度就越快。 如果现场有大量的对象(在数百或数千)可以尝试重用材质或者使用地图集(不推荐)。
  • 着色器重用 Reusing Shaders:如果材质无法重用,至少尝试重复使用着色器(或者相同设置不同参数的空间材质( SpatialMaterials))。

如果有一个场景,有2000个对象和对应的2000个不同的材质,渲染将十分缓慢。如果还是这个场景2000个对象,但是仅仅使用了100个材质,渲染速度将迅猛的提升。

像素耗费 对 顶点耗费 Pixels cost vs vertex cost

一般情况下多边形的面越少渲染的越快。相对的这同时也取决于很多其他因素。

在现代PC和控制台上,顶点耗费很低。非常低。GPUs原本仅仅只需要渲染三角形,所以所有的顶点:

  1. 必须使用CPU进行变换(包括裁剪)。
  2. 必须从主寄存器中发送给GPU内存。

现在,所有这些都是在GPU内部处理的,因此性能非常高。因为一些三维软件(3D DCCs如blender,3dmax等等)需要把几何形状保留在CPU内存进行编辑,所以三维建模人员通常对表现力在多边形数量有所误解,从而降低了实际的性能。事实上,在3D引擎中对物体渲染比在三维软件中显示更有效率。

在移动设备上,情况就不同了。 PC和工作站的GPUs是一个吃电怪兽它能源源不断的从供电中获取电能。移动GPUs受限于电池容量,所以更多的是需要较高的效能比。 

为了提高效率,避免透支使用移动GPUs。 意味着,不止一次的在屏幕中渲染相同的像素(如光照计算等等)。 想象一个有几栋建筑的小镇,GPUs在绘制之前并不知道什么是可见的,什么是隐藏的。 一个房子已经被绘制了然而另一个房子在这个房子前面(同一像素被进行了两次渲染!)。PC GPU通常不太关心这一点,只需将更多像素处理器投入到硬件中即可提高性能(但这也会增加功耗)。

在移动平台中,使用更多的电力是不明智的,所以可以使用一种叫做“基于前片的渲染(Tile Based Rendering)”的技术(几乎每个移动硬件都使用它的变体), 它将屏幕划分为网格。每个单元格保留绘制到它的三角形列表,并按深度对它们进行排序,以最大限度地减少透支。这种技术提高了性能并降低了功耗,但会影响顶点性能。因此,可以处理较少的顶点和三角形进行绘制。

一般来说,这还不算太坏,但是这里还有一个小问题应该避免出现在移动平台上,那就是在出现一个较小的物体但是它有大量的几何形状并且在屏幕中较小。这迫使移动GPU在单个屏幕单元上施加很大的压力,大大降低了性能(因为所有其他单元都必须等待它完成才能显示帧)。

简而言之,不要担心移动上的顶点数太多,而是要避免顶点集中在屏幕的小部分。例如字符、NPC、车辆等。很远(所以看起来很小),使用更小的细节层次( LOD )模型。

必须考虑顶点额外的消耗情况像每个顶点具有额外处理的对象,例如:

  • 蒙皮 (骨骼动画)
  • 形变 (形状键)
  • 顶点光照对象 (移动设备上常见)

纹理压缩 Texture compression

Godot在导入三维模型时提供了纹理压缩(显存压缩)。显存压缩在存储时效率不如PNG或者JPG,但是大大的提高了绘图性能。

这是因为纹理压缩的主要目标是减少内存和GPU之间的带宽。

在三维中,物体的形状更多地依赖于几何形状而不是纹理,所以压缩通常效果不明显。在二维,压缩更多的取决于形状内部纹理的,所以人为操作比压缩更有效。

请注意,许多安卓设备不支持拥有透明度的纹理进行纹理压缩(只能用不透明图片),所请记住这一点。

透明物体 Transparent objects

如前所述,Godot按材质和着色器对对象进行排序以提高性能。 然而在透明的物体上没有效果。透明对象从后到前进行渲染以与后面的工作进行混合。 因此,尽可能少的使用透明物体! 如果对象有一个具有透明度的小截面,请尝试使为该截面添加单独的材质。 

层次细节 Level of detail (LOD)

正如前面提到的, 在某些情况下使用顶点数量较少的对象可以提高性能。Godot对应层次细节提供了一套十分简单的系统,几何形状实例( GeometryInstance)是基于一个定义了可视范围的对象。可以在不同的工作范围内定义一系列的几何形状实例(GeometryInstance)作为 层次细节( LOD)。

使用实例(多网格模型)Use instancing (MultiMesh)

如果相同的物体被放置在同一地点或者互相临近,请使用(MultiMesh)替代。多网格模型(MultiMesh)在绘制成千上万的对象时可以尽可能多的减少消耗,理想的物体就像羊群,草地,粒子等等。

烘焙光照 Bake lighting

小灯光通对性能的影响可以忽略。阴影可能会影响一些。如果多个灯光同时影响着一个场景,使用烘焙(Baked Lightmaps)是个好主意。烘焙还可以通过增加间接光线反射来改善场景质量。

如果是移动设备推进使用烘焙,因为这种方法更快。 

转载于:https://www.cnblogs.com/joojhoo/p/8599165.html

你可能感兴趣的:(Godot-3D教程-02.3D性能和局限性)