UE 性能相关

概述

基础优化

帧数和LOD

  • Stat FPS 可以显示帧数
  • 锁帧设置 项目设置 Use Fixed Frame Rate。一般优化的时候不要勾选
  • 自定义LOD,打开模型,右下角 LOD Settings

材质优化

  • 合并材质
    • 在上方 selection mode 那个下拉框里面有一个 modeing,能减少draw call
    • 如果物体不需要破碎可以合并一下
  • 纹理压缩
    • 使用纹理压缩格式,如DXT, BCn。打开材质后
      • 修改Maximun Texture Size 等参数
    • 开启纹理流式加载
    • Tools->Render Resource Viewer 可以快速定位资源
  • 材质复杂度
    • 场景浏览器->Optimization viewmodes->Shader Complexity 查看材质复杂度
    • 打开复杂的材质,然后进去优化,比如shader逻辑优化
  • 尽量使用材质实例,而不是单独的材质(这是需要额外的加载时间的)

Nanite

  • 打开nanite
    • 保证项目设置 Rendering ->Nanite 是勾选的
    • 模型设置 Nanite Settings 勾选 Enable Nanite Support
    • 场景浏览器,左上角,Nanite Visualization 可以看效果

开nanite就不需要LOD了,但是移动端不适用。

移动端性能落后,渲染架构简单,实现不了。

光照优化

  • LightMap

场景浏览器->Optimization view mode -> lightmap Density

对于效果差的物体(东西藏那么深还光照烘的那么好),选中,右下角细节面板搜索lightmap,

比如 Overriden Light Map Res(灯光密度), 可以改低一点

  • Light Complexity (同样场景浏览器可以选择出来)

一般是场景中有很多动态的灯,叠加照射到同一个地方。可以转烘培

如何烘培呢:

  • 灯摆好
  • 效果拉满
    • 比如Render->Dynamic Gloubal Illumination Method 是不是 lumen
    • 场景中的Directional Light 的 cast Dynamic Shadow 动态阴影,Distance Field Shadow 是否打开了
    • 后处理是否打开了
  • 准备插件 GPU Lightmass
  • Build 里面配置完,跑,然后去睡觉
  • 烘出来的贴图在 Content 里面

模型批次合并

选中多个物体

Tools->Merge Actors

然后合并完又可以当成单个模型,设置LOD,Nanite

层次剔除(Hierarchical Level Of Detail HLOD)

将远距离多个对象合并为一个低多边形对象,以减少远距离物体的绘制开销。

  • world settings -> Hierarchical LOD Set UP 在这里新增几个,
  • 主菜单 Window->Hierarchical LOD Outliner
    • 这里能看到刚刚在world settings创建的几个 level
    • 点击 Regenerate Clusters 重新生成集群
    • 点击 Generate Proxy Meshes 构建HLOD代理
    • 点击 Build All 生成
    • 大概 0.5h,挺久的

视锥剔除(Frustum Culling)

默认开启的,之渲染视锥内物体。

可以设置相机的FOV。

Project Settings->General Settings -> Near Clip Plane 可以设置近景层面

命令: FreezeRendering

冻结渲染,觉得卡的时候,冻结一下,就可以看到背后是没有被渲染的。

可以查看那些模型意外的没被剔除掉

ps: 比如某个模型没有碰撞,就不会与视锥碰撞,就不会被视锥剔除

遮挡剔除(Occlusion Culling)

查看遮挡剔除的情况

命令 r.VisualizeOccludedPrimitives 1

r.AlloOcclusionQueries 1 0 启用禁用遮挡查询。关掉后本来应该被遮挡剔除掉的东西就没被剔除掉

r.HZBOcclusion 启动禁用基于层次的遮挡剔除

开关在 Project->Rendering->Culling 下面,默认是开启的

分辨率

r.screenpercentage 100

手动动态分辨率?

CPU 优化

  • 多线程执行物理,AI,渲染等任务
  • 并行库,如 Intel TBB
  • 异步加载
  • 减少tick改为事件驱动
  • 优化数据结构和算法
  • 内存管理,内存池,对象重用,预分配内存

Instanced Static Mesh

解决场景中大量石头,树有很多draw call

可以

创建一个Actor,添加这个组件,选择一个static mesh

通过在蓝图中写 :

脱出这个组ins static mesh -> add instance -> set custom data value (连一下add instance的返回值和组件target)

用这个东西去代替原来的static mesh 放到场景中。这样mesh会一起渲染,只提交一次。

适用于场景中大量相同的静态网格

Hierarchical Instanced Static Mesh

创建actor 创建组件,和上面一样

在上面的基础上,添加了层级结构管理,支持视锥裁剪和遮挡剔除

使用四叉树,八叉树的空间分割,更高效的处理裁剪和剔除,支持动态LOD管理。

适用于大量实例需要高效遮挡和剔除的情况。

【写一个工具,拖进来一个mesh,自动生成能支持合并批次的mesh】

抗锯齿

Anti-Aliasing Method

关掉可以提高帧数,但是会出现锯齿。

也可以选择fast的版本

对于延迟渲染有效

性能分析工具和命令

命令:

  • stat FPS
  • stat unit
    • Frame
    • Game 主线程消耗
    • GPU
    • RHI
    • DynRes 动态分辨率和采样
    • Draws (draw call)
    • Prims 面数

stat scenerendering

场景浏览器工具:

Light Complexity 灯光复杂度,比如灯漏删了

Lightmap Density 灯光密度,一般是烘培后的灯的细节太多 ,可以设置降一点

Shader Complexity 材质复杂度,该优化shader写法啦

Shader Complexity & Quads 面数太红,一般就减面和LOD

Quad Overdraw

Required Texture Resolution 贴图分辨率

具体操作

Use Fixed Frame Rate 看看

stat fps

stat unit

从上到下

FPS,

Frame 这一帧消耗了多久

Game 游戏线程,物理,碰撞

Draw 渲染线程消耗,半透明,天空雾气,Nanite,光追,遮罩,AO,剔除

RHI 提交命令

GPU Time。Fence 等待时间

DynRes

Draws: Draw Call

Prims: 三角形

  • 暴力优化

Outliner 场景里面灯光的眼睛 点一下隐藏。发现帧数提高了。

同理,看看那块比较耗。

一般都是灯光

  • stat Game

假设游戏线程消耗比较大

比如TickableGameObjects Time。你写的对象继承 Tick 写的太多了,或者有太耗费的材质,或者设置tick频率慢一点。

找到有问题就继续下去,比如

stat AI

  • STAT GPU

。。。

  • 使用 UnrealInsights
上一篇
下一篇