【转载】UE4 大世界场景制作与性能优化 您所在的位置:网站首页 ue4植物优化 【转载】UE4 大世界场景制作与性能优化

【转载】UE4 大世界场景制作与性能优化

2023-09-05 07:00| 来源: 网络整理| 查看: 265

版权声明:本文为CSDN博主「Papals」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:blog.csdn.net/qq_23030843…

一. 使用工具 1.1 使用 HLOD

由于 HLOD 是减少 DrawCall 的方案,所以其实它会对渲染性能的提高能够起到一定的帮助作用。因为它是将场景中互相独立的静态 Mesh 通过顶点和材质合并的方式聚合在一起,本来由于材质和顶点 Buffer 的不同而没有办法形成一个统一的 Drawcall ,现在可以迎刃而解。很显然那些被合并的顶点和索引 Buffer 再也不能被复用了,而且 pack 到一起的纹理也是一样,它们都变成了场景中独一无二的资源,所以理论上讲 HLOD 是一种用空间来换取时间的方法。 所以 HLOD 是会增加内存使用的,如果是巨量的 HLOD ,不仅适得其反,会影响渲染性能的使用, cook 的时候一个 HLOD 的文件大小是及其夸张的。压缩这些 HLOD 文件可能花费了数个小时的时间,它大大降低了研发迭代的效率。

将世界场景设置中的 Enable Hierarchical LODSystem 打开。

image.png

我们首先在 windows 界面打开 HLOD 管理器

image.png

image.png

我们点击 Generate Cluster, 它会把所有 level 里面的空间位置临近的 Mesh 分组为一个 Cluster 。如果觉得分的不好的话是可以自己手动修改的。

image.png

然后我们点击加号增加 HLOD 的个数,例如我们增加两个,一共三个 LOD

image.png

确定好之后,点击 Generate Proxy Meshs 将会分组的 HLOD 数据。等待一段时间。

HLOD 调试

我们选择 HLOD 的视图模式

image.png

image.png

我们由近到远就可以看到 HLOD 的变化。

参数设置

距离每个 cluster 越近,使用的 LOD 的数值越小,Mesh 的数据越精确。每个 LOD 上面都有特定的参数。

image.png

更多信息:分层 LOD 大纲视图参考

1.2 使用 LOD 和 Merge Actor 使用 LOD

所以其实我们并不需要所有的物理都变为 HLOD 的,当然这个部分没有踩过坑是没有办法预知的,因此我们对于某些 Mesh(待定)使用 LOD 应该就 ok 。我们的每个 Mesh ,都需要设置LODs。

image.png

这里我们有了标准是可以使用脚本刷的。

相关调试 r.StaticMeshLODDistanceScale r.forceLOD

由于我们的 LOD 是可以使用简化材质的。

使用 Merge Actor

image.png

由于 HLOD 的内存问题,所以另一种方案是 合并 Actor,因为它是生成一个新的 Mesh 和Material,所以它并不会产生额外开销。

image.png

1.3 使用 Virtual Texture

首先开启 virtual texture

image.png

然后,我们将所使用的贴图进行转换

image.png

也可以在纹理编辑器里进行转换

image.png

若未使用上述转换菜单选项,将立即导致引用转换纹理的所有现有材质失效。应打开引用违规纹理的所有材质,并将纹理取样节点设为使用正确 虚拟(Virtual) 采样器类型。例如,虚拟纹理应使用 虚拟颜色(Virtual Color) 而非 颜色(Color) 采样器类别

image.png

调试 r.VT.Borders 1 1.4 使用 Level Streaming

Getting Started with Level Streaming | Live Training | Unreal Engine

1.5 使用纹理流送

此处用来保证 MipMap 的正确性。我们构建纹理流送数据:

image.png

构建检查

纹理流送构建期间计算的数据准确性可以通过查看纹理流送准确性视图模式来检查:

image.png

Primitive 距离准确度

这会显示流送器计算的 视图网格体距离 与 实际 GPU 距离 相比较的准确性。流送器计算从视点到纹理实例轴对齐边界框(AABB)的 距离。通过将使用该纹理的组件 LOD 部分 AABB 加总起来,在构建流程中计算该边界框。这里显示的值可以通过更改网格体组件的 流送距离乘数(Streaming Distance Multiplier) 调整。

image.png

网格体 UV 密度准确性

这种视图模式显示 流送器使用的网格体场景纹理坐标(texcoord)大小与实际 GPU 值比较的准确性 。这种大小通过 场景空间单位 与 纹理坐标变体 之间建立关联。 流送器用它来 评估纹理坐标对纹理采样的影响 。这种视图模式属于相当的视点不可知类型,当网格体的值不理想时,它们通常与场景无关,而是与网格体有关。这意味着,如果任何网格体包含错误数据,则使用该网格体的任何组件很可能变得不正确。在静态网格体或骨架网格体编辑器中,通过调整 StreamingDistanceMultiplier 直到网格体位于 良好(Good) 范围内,可以更改该值。

image.png

材质纹理缩放准确性

材质中使用的大多数纹理都使用其中一个网格体 UV 密度的缩放值来采样。纹理流送构建 尝试计算使用哪个纹理坐标以及对每个采样纹理应用哪个缩放 。 这可能会因为许多原因而失败,如果失败,流送器会假设纹理是使用 纹理坐标 0 和 缩放 1 进行采样的。

image.png

所需纹理分辨率

在该视图模式下,可以显示当前 流送纹理分辨率 和所需 纹理分辨率 之间的关系。该视图模式与材质纹理缩放有一些相似之处,但它不显示纹理流送数据的准确性,而是显示当前以绝对方式 加载的纹理分辨率 的有用性。任何时候针对纹理加载的分辨率都来自于逻辑和指标的组合。

例如,纹理可能会缺少分辨率,因为没有足够的可用空间加载纹理,或者 它没有过多的分辨率,因为其更高的 mip 缓存在纹理池中等待将来使用。此外,流送器通常由需要最高分辨率的组件驱动, 因此调查纹理对一个组件的行为仅在这个组件是驱动其分辨率的组件时才有意义。

image.png

1.6 使用 Static Mesh Instancing

对于材质一样,mesh 一致,仅有旋转,位置,大小不一致的的大量物体,例如书柜里的书,我们是可以使用 Static Mesh Instancing 来进行

r.MeshDrawCommands.DynamicInstancing

虚幻 4.22 引入了 自动实例化 的功能,因此无需再自行管理。手动做比自动做性能好?不是很清楚。合并太多的对象会把视锥剔除和遮挡剔除的所有优势抵消。如果静态网格体使用 LOD , 每个 LOD 都将在 GPU 上单独执行一次绘制调用。

二. 把控风险 2.1 内存相关 材质中使用默认的纹理,(一个纯白的一像素纹理等等)因为一个材质加载进来会将所有的硬引用的贴图数据(材质中指定的那个贴图)进行加载,但是我们其实只使用的是它的 instance 里面的数据,或者是我们后面给它重新赋值的贴图。

image.png

贴图大小不是 2 的整数,这个很好理解 512*512 的贴图的内存是 512*512,但是 513 *513 的数据的内存是 1024*1024。并且将不会有 mipmap 。 贴图的压缩格式,我们看到一个贴图很模糊不一定是它的分辨率的问题,可能跟它的压缩模式有关系,所以尝试调整。

image.png

材质接口的使用,如果有端口是你不使用的,那么请使用一些方案让它变成暗的,因为每个亮的节点都会增加不必要的变体消耗。

image.png

硬边缘和 UV 接缝管理规则:UE4 会沿着 UV 接缝和硬边缘分割网格体的边缘产生大量顶点数量,大部分边缘应尽可能保持平滑,UV 接缝数量尽可能少 正确设置纹理组, 打包的时候才能严格控制。 2.2 性能时间 关闭远距离 LOD 的阴影投射,可以节省几毫秒。远距离的阴影就算了把!!!!!!!!

image.png

移动物体的使用, 固定光源的使用,


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有