内容优化
本文给出了一些提示和技巧可帮助您优化项目的性能。
要想显示当前场景的性能状态,可使用Performance profiler(性能分析器)工具。 该工具能针对您应该怎样做来提高性能给出提示。
细节层次(Level of Details)
细节层次(LOD)的使用是优化您项目的主要方式。
创建LOD
要想为已有对象创建LOD,须执行如下操作:
-
在三维计算机图形软件(Autodesk 3ds Max,Autodesk Maya等等)中为mesh对象创建一个或多个LOD。 例如,您只需复制已有对象,然后再创建一个具有少量三角形的对象即可。
您应为有独特材质被分配其上的模型的每部分都创建LOD。
- 在同一点放置多个LOD,以使它们的坐标重合。
-
将这些LOD导出为一个单独的.mesh文件,其中的每一个LOD都是对象的一个表面。
如果单独的表面需要不同材质或是代表着LOD,那就需要将其导出。 这样就需要导出模型中的表面数量要保持尽可能的少。
您可以点击此跳转章节了解更多有关LOD的信息。
使用LOD
LOD的用途很广泛:
通过距离切换
为了加速渲染,须在达到给定距离之后切换LOD:
- 通过点击Windows(窗口) -> Nodes(节点)打开Nodes(节点)窗口,并选择您那带有LOD的mesh对象。
- 在节点的Surfaces(表面)标签页内指定Visibility(能见度),Fade(衰减)和Parent(父级数)参数。
-
最近的LOD的最大能见距离应是下一个LOD的最小能见距离。 当摄像机和某一对象间的距离达到指定距离时,LOD就将被切换。
-
为使这一操作更平滑且不那么明显,须指定minimum fade(最小衰减)和maximum fade(最大衰减)参数。 其指导思想与能见距离的操作是一样的。 最近的LOD的最大衰减距离应是下一个LOD的最小衰减距离。
-
Minimum parent(最小父级数)和maximum parent(最大父级数)参数允许您指定要测量表面层级中的哪个对象的最小能见距离。 您可以点击此跳转章节查找更多有关这些参数的信息。
-
下面的例子向您展示了在Port Angeles演示项目中是如何实施LOD的:
14698个多边形 | 10840个多边形 | 2958个多边形 |
另请参阅Objects(对象)章节(或路径下文件夹<UNIGINE_SDK>/data/samples/object)中的LOD范例:
- lods_00
- lods_01
- lods_02
- lods_03
使用Collision(碰撞)和Intersection(相交)
另一种降低性能开销的方法是为mesh创建碰撞检测表面和相交检测表面。
- 在3D设计软件中为整个mesh创建检测表面。
- 待将该mesh添加到虚拟世界之后,启用检测表面的Intersection(相交)和Collision(碰撞)选项。
- 将该mesh的其它所有表面的这两个选项(Intersection(相交)和Collision(碰撞))都禁用,以此来降低计算量。
- 指定Viewport(视窗)掩码来不对检测表面进行渲染。 另一种不渲染检测表面的方法是不分配材质。 您可参阅City Traffic(城市交通)系统中的检测盒例子。
处理大量对象
可使用簇(cluster)和杂物(clutter)来优化大量对象。 该方法允许将大量完全相同的网格作为单个对象来管理。 这将有助于简化节点的空间树,从而提高性能。
-
要想在虚拟世界中按照指定位置设置大量完全相同的网格,可使用ObjectMeshCluster。
您可以点击此跳转章节查看如何从完全相同的网格创建簇对象(cluster)的例子。
-
要想在虚拟世界中随机散置大量完全相同的网格,可使用ObjectMeshClutter。
您可以点击此跳转章节查看如何从完全相同的网格创建杂物对象(clutter)的例子。
实例化(Instancing)
被分配了相同材质的完全相同的网格(对ObjectMeshSkinned网格而言,附到它们顶点上的骨骼的数量也是相同的)的表面会在一个绘图调用(draw call)中被自动实例化和绘制。 Instancing(实例化)标记选项默认是被启用的。
我们强烈推荐【不要】更改节点的表面属性中的表面的材质。 这样做会在材质的空间树中创建材质副本,从而降低性能。
为了避免这种情况的发生,可在材质库中创建新材质(点击菜单栏上的Windows(窗口) -> Materials(材质))然后创建材质的层级。
这将有助于提高您项目的性能。
冒充者(Impostors)
下面给出的是针对您在使用Mesh Clutter(网格杂物)的情况下如何来优化性能的提示。
将ObjectGrass作为mesh clutter的最远LOD。 您应使用Grabber(抓取器)工具来创建impostors:
印花(Decals)
使用印花(Decals)会非常有利于优化性能。 有了它们,您就能在基本不造成性能开销的前提下添加大量的额外细节了。
例如,在Port Angeles演示项目中,我们将印花(decals)用作了市区住宅的最远LOD。
纹理(Textures)
请【不要】使用分辨率大于4096x4096的纹理。 如果那样的话,将会明显降低您的FPS数。 要想优化您的纹理,须执行如下操作:
-
压缩纹理。
我们推荐您在您项目的textures文件夹中创建名为uncompressed的文件夹来存储未压缩的纹理。 添加特别的后缀来使用imagedds脚本自动压缩您的纹理,或是使用ImageDDS工具用于自定义压缩。
- my_project - 指您项目的文件夹。
- textures - 指压缩纹理的文件夹。
- uncompressed - 指存储您的源未压缩纹理的单独文件夹。 您应将它们放进这个文件夹。
- textures - 指压缩纹理的文件夹。
- my_project - 指您项目的文件夹。
- 压缩地形纹理。 此外,点击此跳转章节可了解有关地形优化的内容。
- 为着单一色彩的纹理应用小尺寸。
反射(Reflections)
这部分包含了针对反射使用的优化给出的提示。
- 应使反射数量保持尽可能的少。 每一个拥有反射的表面都会被渲染两次,为的是加倍三角形的数量以及绘图调用的数量。
- 为摄像机使用反射掩码。
要想让表面拥有反射,须执行如下操作:
- 打开Camera(摄像机)设置窗口。
-
指定摄像机的反射掩码。
- 在Nodes(节点)窗口中,选择您那带有导出LOD的节点,并指定Viewport(视窗)掩码来启用表面的反射。
- 打开Camera(摄像机)设置窗口。
- 为指定节点中使用了同种材质的子网格启用Shared reflection(共享反射)选项。
-
指定全局Reflection Distance(反射距离)参数来设置反射被关闭时的距离。
要想指定Reflection Distance(反射距离)参数,须通过点击菜单栏上的Windows(窗口) -> Render Settings(渲染设置)打开Render Settings(渲染设置)窗口。
光照(Light)和阴影(Shadows)
如下的指导方针可用来提高阴影和光照方面的性能:
- 由于World Light(世界光)光源会照亮场景中的所有对象,因而会增加阴影的计算量,所以应使World Light(世界光)对象的数量保持尽可能的少。 就项目性能而言,其它类型的光源(像Projected Light(投影光)光源等等)则更适合大多数场合。
- 使用Light(光照)掩码来指定哪些表面应被照射。
要想指定光源的光照掩码,须通过点击Windows(窗口) -> Nodes(节点)打开Nodes(节点)窗口并选择您的光源。 在Light(光照)标签页内指定光照掩码。
指定的Projected Light(投影光)光源的光照掩码。光源只照亮那些它们的光照掩码与光源的光照掩码相匹配的表面。
参阅此跳转章节可了解更多有关掩码的内容。 - 指定光源的Light Distance(光照距离)和Shadow Distance(阴影距离)参数。 这两个参数会在摄像机被放置于距某个对象给定距离处时关闭该对象的光照渲染和阴影渲染。
要设置这些参数,您只需按如下步骤操作即可:
- 禁用某些表面(例如,最近的LOD表面)或材质的Cast\Receive shadow(投射/接收阴影)复选框。
要想禁用这些复选框,可打开Nodes(节点)窗口(点击菜单栏上的Windows(窗口) -> Nodes(节点)或按N键打开)。 之后选择节点并打开Surfaces(表面)标签页。
表面的Shadow参数。要想设置材质的shadow参数,可打开Materials(材质)窗口 (点击菜单栏上的Windows(窗口) -> Materials(材质)或按M键打开)。 之后选择材质并打开Common(通用)标签页。
材质的Shadow参数。 - 为静态对象应用光照贴图。
- 要富有创造力,并善于从不同角度考虑问题! 例如,在您只需要光源可视而无需照明时可使用billboards(布告板)。
在Port Angeles演示项目中,我们就将billboards(布告板)用作了起飞跑道照明灯。 它们不产生任何光照,但看起来却像是真实灯光。
剔除(Culling)
对象的剔除允许不渲染那些未在视锥体内呈现的对象。
- 从三维计算机图形软件导出处于本地坐标的对象可使mesh的界限更接近几何体。
- 使用闭区(Sectors)和入口(Portals)。
- 使用遮挡器(Occluders):遮挡器对象,遮挡器网格,遮挡器地形。 如果在复杂环境中存在许多彼此遮挡且渲染开销又很大的对象(它们拥有大量多边形和/或巨型着色器),那使用遮挡器将会非常有效。