优化UE4性能 、减少DrawCall——材质中使用自定义基元数据

时间:2024-04-13 13:20:13

优化UE4性能 、减少DrawCall——材质中使用自定义基元数据

UnrealEngine减少DrawCall有很多种方法,今天分享一种使用材质自定义基元数据的方式有效减少DrawCall,优化虚幻4运行性能。

使用自定义基元数据(CPD)工作流时,利用材质将自定义的数据存储在索引中,可以通过蓝图和代码访问并修改,功能类似与动态材质实例,可用在运行时通过标量和向量参数动态控制材质。区别在于,CPD的优势是数据存储在基元自身而非材质实例上,减少了重复几何体的绘制调用次数,减少DrawCall的数量,优化UE4游戏运行。

本文参考官方文档https://docs.unrealengine.com/zh-CN/Engine/Rendering/Materials/CustomPrimitiveData/index.html

本案例通过对比基元存储自定义数据 和 动态材质实例两中方案,反映使用自定义基元数据优化DrawCall,优化游戏性能方面的作用。

范例一、

创建材质、向量节点,如图,将Use Custom Primitive Data 选项勾选——使用自定义基元数据
优化UE4性能 、减少DrawCall——材质中使用自定义基元数据
Primitive Data Index 表示基元数据的序号,这里使用的序号将是后面蓝图或程序调用的序号。优化UE4性能 、减少DrawCall——材质中使用自定义基元数据
创建蓝图Actor,并添加Sphere模型,将之前材质球指定该物体优化UE4性能 、减少DrawCall——材质中使用自定义基元数据
在该蓝图Actor中,对自定义基元数据进行设置,Set Custom Primitive Data Vector4,注意这里序号同材质中自定义基元的序号相同。ValueW值是1.优化UE4性能 、减少DrawCall——材质中使用自定义基元数据
范例二、

新建材质球M_dynamic,向量节点,这次使用默认参数。如下图
优化UE4性能 、减少DrawCall——材质中使用自定义基元数据
创建蓝图Actor_dynamic,同样加入sphere 模型,给它指定M_dynamic材质,并创建动态材质,设置如下优化UE4性能 、减少DrawCall——材质中使用自定义基元数据
优化UE4性能 、减少DrawCall——材质中使用自定义基元数据
这里ParameterName需要和材质球中vector的名称相同。优化UE4性能 、减少DrawCall——材质中使用自定义基元数据
到此,两个范例完成,可以对其进行对比,看看DrawCall的数量优化情况。

查看DrawCall的方式,使用控制台, ~键,实时场景统计:stat SceneRendering

(再次输入命令,窗口消失)

场景没有放Actor,运行ue4,DrawCall情况如下图,是4优化UE4性能 、减少DrawCall——材质中使用自定义基元数据
加入一个基元数据Actor后,DrawCall情况如下图,是8优化UE4性能 、减少DrawCall——材质中使用自定义基元数据
加入40个基元数据Actor后,DrawCall情况如下图,是66优化UE4性能 、减少DrawCall——材质中使用自定义基元数据
换做动态材质Actor,进行对比,一个也是8优化UE4性能 、减少DrawCall——材质中使用自定义基元数据
加入40个动态材质Actor后,DrawCall情况如下图,是112优化UE4性能 、减少DrawCall——材质中使用自定义基元数据
这里对比已经很明显,当Actor的数量增加,同样40个物体,一个DrawCall是66,一个是112。用自定义基元数据的物体绘制DrawCall数量比使用动态材质的物体低了近一半。且物体数量越多同样效果,通过优化材质,DrawCall少了一半,性能提升一倍。

作者:雷蕾 2020.9.4 北京 原创不易,转载请注明!