kizumi_header_banner_img

不自由であることを誇れるだろうか

文章导读

UE5性能优化方案


avatar
Misaya2314 2024年9月15日 27

性能测试工具

Stat(统计数据)

stat是ue中用于获取项目运行状态的功能。

通过点击左上角的按钮呼出统计数据栏目,可以选择需要显示的具体数据

推荐打开unit,FPS

通过调整摄像机位置,观察右侧帧率和响应时间波动,当帧率波动较大的时候说明目前场景性能可能存在较大的消耗。

编辑器内命令:

Stat FPS

Stat unit

Stat unitgraph(追加图表显示)

t.maxFPS 144(解放帧率上限)

GPU Profile

用于对于GPU进行抓帧。

Ctrl +shift+,可以打开GPU Profile,通过观察帧生成延迟来知晓性能损耗。

通过分析帧生成耗时,来判断花费较大的资源。例如此例中,shadow depths时长4.96ms,开销较大。

优化视图模式

用于查看当前场景的复杂度

光照复杂度

通过调用光照复杂度模式,来查看场景中的光照资源消耗。ue中使用颜色来区分性能开销

以左侧蓝色为低开销,白色开销最大,每一个光源的交汇处会产生非常大的开销,可以通过减少渲染范围优化光照

具体优化方案查看调优方案《光照优化》小节

四边形过渡绘制

查看场景中的网格体面数资源消耗,同光照复杂度,使用颜色区分性能开销

具体优化方案查看调优方案《多边形面优化》小节

所需纹理分辨率

查看场景中的actor纹理使用消耗情况

在所需纹理分辨率视图模式下,需要指定场景中的actor进行材质分辨率判断,例如此例中选择了地板actor,点击左上方的纹理(场景选择),选择该网格体的任意纹理查看,如果材质显示为绿色,则说明当前的材质分辨率较高,可以降低材质分辨率进行优化。

此处的地面颜色显示为绿色,说明消耗较高。

具体优化查看调优方案《材质优化》小节

调优方案

场景优化的两个优化大头实际上是光照和三角面的优化,这点从ue5中的两大革命性功能就可以看出,分别是lumen(光照算法)和nanite(多边形面算法优化)由于本项目没有采用这两个功能,所以优化思路采用传统的优化思路。

光照优化

由于不同种类的光对性能消耗不同,其中可以移动性光源对于性能的开销最大。(当开启lumen后,可移动光的性能消耗反而最小,这与lumen的算法有关)因此我们需要尽量减少可移动光源。如果实在需要使用可移动光源,则需要尽量减少其性能开销。

在光照复杂度视图模式下可以知晓交汇处的可移动光会消耗非常大的性能,所以我们的优化思路是尽量减少可移动光的渲染范围,让他们不产生交汇。

调整光源的衰减半径和锥体角度可以减小不同光源的交汇,这可能会导致光源亮度下降,这个时候把强度再稍微提高便可以补偿亮度损失。

给光源添加最大绘制距离

这使得玩家在远离光源组件的时候,光源不会被渲染。

多边形面优化

对于一个模型,其三角面越多,计算机会产生的性能消耗便会越大,因此优化思路是尽量减少多边形面

使用lod层级来动态的减少三角面。由于ue5有比较完善的自动lod功能,我们只需要设置好lod层级个数就可以了

点击一个网格体,进入编辑界面,从右侧细节面板调整lod数量

一般调整为5左右就差不多了,记得选中自动计算lod距离,随后点击应用改动,如果需要自定义lod层级,则勾选上方的自定义方框。

材质优化

通过所需纹理分辨率视图模式分析分辨率情况后,通过以下方法来调整纹理分辨率

方法1:进入到一个纹理编辑页面,更改细节面板中的“lod偏移”参数,lod值增加1,则该材质的已显示分辨率会降低一倍,例如本例中的材质分辨率为4k,将lod更改为1后,分辨率降低为2k

方法2:同样在细节面板中调整,更改压缩➡尺寸➡最大纹理尺寸。此方法可以自由的调整纹理的分辨率,不过由于分辨率格式问题,不建议调整成其他分辨率倍数,可能会导致适配问题。这里建议直接使用方法1

批量处理方法:

由于一个网格体大部分情况下会使用多个材质,因此很需要批量处理。

同时选中多个材质,右击,选择资产操作➡通过属性矩阵进行批量编辑,更改右侧的属性编辑器中的属性即可批量更改。

其他优化思路

减少actor放置

尽量减少对actor的拆分放置,对于某些相似actor,例如墙壁,建筑等,在确定不进行更改后,应当将拆分的actor进行合并,从多个actor合成一个大actor,减少性能消耗。

ue5对actor合并功能进行了很大程度的优化

在stat调出unit后,可以查看到一个参数“Draws”,这个参数被称为绘制调用

绘制调用是指查找资产,发生在每一帧。你的应用程序使用的绘制调用次数,取决于场景中独特网格体的数量,以及每个网格体使用的独特材质ID数量。当前,大量的绘制调用是导致图形性能降低的最大原因,因此应尽可能减少。

选择需要合并的actor,点击工具栏目,在下拉菜单中找到合并actor,合并方法选择分批。

合并后,发现原本的静态网格体被合并成了一个actor,被合并成了一个instance网格体,类似于植被系统中的植物,并且发现Draws数值明显减小。合并后,仍然可以对单个网格体进行编辑。

删除玩家摄像机外的物体

设想玩家在游玩过程中,哪些物体是无法被看见的,那么无法被看见的资产便需要进行优化,例如,删除许多玩家基本上无法看见的植被,建筑,减少渲染损耗。

减少蓝图中的tick事件

由于tick事件会进行每帧的判断,这导致他的开销远大于其他事件,因此在蓝图开发中尽量减少tick事件使用,或是增加tick时间间隔。

减少网格体碰撞消耗

对于玩家接触不到的网格体,可以取消其碰撞,或是简化碰撞体积。

ue5官方文档

https://dev.epicgames.com/documentation/zh-cn/unreal-engine/guidelines-for-optimizing-rendering-for-real-time-in-unreal-engine

感谢您的支持


评论(0)

查看评论列表

暂无评论


发表评论