【UE4】项目性能分析 您所在的位置:网站首页 drawcall翻译 【UE4】项目性能分析

【UE4】项目性能分析

2023-07-04 23:40| 来源: 网络整理| 查看: 265

https://zhuanlan.zhihu.com/p/148886428

https://zhuanlan.zhihu.com/p/46596917

https://zhuanlan.zhihu.com/p/43742565(重要)

https://software.intel.com/content/www/cn/zh/develop/articles/unreal-engine-4-optimization-tutorial-part-1.html(重要intel)

 

因为查找的文章较多,以下部分内容为引用内容

向原作者表示感谢。

 

FPS和Ms的关系

 

Session Frontend 性能采集开启运行程序输入命令行开始记录  

Stat starfile  

Stat stopfile

开启工具获取抓取日志

移动端的会在UE4 Games文件夹下

游戏管线

渲染管线

 

 

 

 

命令行相关

 

 

其它还包括

stat ShadowRendering

stat SceneRendering 可以看到DrawCall,以及阴影,后处理等信息

stat Memory

stat LightRendering

部分说明

stat RHI

检查各种贴图和triangle的消耗。

能够让我们查看drawcall的数量

2000-3000的drawcall是一个标准

超过5000就有点高了

超过10000就可能会产生问题

对于手机平台,绘制调用要少得多,通常几百次,一般不超1000次

 

stat SceneRenderingstat Gamestat Gpu

 

stat unit

 

 

Freezerendering  冻结画面   0 - 1

在虚幻4的控制台里,可以输入Freezerendering和Unfreezerendering来冻结和取消冻结当前渲染的画面。用人类的语言来描述就是,当你敲下这个命令的那一瞬间,除了你ue4编辑器当前视口能看到的东西,其他不参与当前这一帧渲染的物体都消失了,就这么简单。

 

stat Slow [-ms=0.3] [-maxdepth=5]    

此命令将显示游戏线程和渲染线程的统计。所有 stats 将作为一个 stats 大群组进行渲染。无法访问分析工具或日志文件、或需要测试游戏的基础性能时,此命令十分实用。(默认只显示大于 1.0 毫秒的 stat 项目,以及超过 4 个关卡未被套入的 stat 项目。

 

 

作者:皮一皮很开心

链接:https://zhuanlan.zhihu.com/p/46592847

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

r.VisualizeOccludedPrimitives 1    显示被遮挡的

能够将遮蔽裁剪纳入考虑优化关卡(添加一些阻挡视线的物件来提高性能)。使用

r.VisualizeOccludedPrimitives 可以直接查看。

 

r.AOSpecularocclusionMode

可以让 skylight 产生的 DFAO 产生更准确的高光, 0为开启,1为关闭。大多数项目中,粗暴地设置r.AOSpecularocclusionMode 0 ,都可以直接获得的skylight 照明提升

 

 

 

r.SO.VisualizeBuffer 1

stat softwareocclusion

显示移动端软裁切预览(仅就在移动端预览下)

https://shimo.im/docs/YPD3Kc9WrKJxtwtW/ 《软裁切使用》,可复制链接后用石墨文档 App 或小程序打开

 

 

r.TiledDeferredShading.MinimumCount

能够调整使用多少灯光应用在基于Tile的延迟光照技术(视觉上并没有差异但性能会有不同)

平铺延迟灯光:开启 r.TiledDeferredShading 禁用 GPU 灯光,或使用 r.TiledDeferredShading.MinimumCount 设置使用平铺法或非延迟法的时机。

 

 

showflag  关闭所有

游戏运行时在控制台里使用showflag(隐藏)命令可以帮我们快速定位具体是模型?特效?光照?等等哪个消耗高,消耗高的就优化,列举几个常用的”showflag.”命令“0”关闭“1”打开:

 

draw distance    

对场景中较小的物体,编辑其属性draw distance来获得更佳的LOD裁切效果

 

 

r.SetRes: 调整渲染分辨率

r.VSync 开启/关闭垂直同步(可能依赖于是否原生全屏)。

r.AllowOcclusionQueries 0 用于禁用遮挡(可以让场景运行的更慢)。1为开启剔除

r.TiledDeferredShading 能够关闭基于 Tile 的延迟光照技术(GPU粒子的光影则没有退回方法)

r.TiledDeferredShading.MinimumCount 能够调整使用多少灯光应用在基于 Tile 的延迟光照技术(视觉上并没有差异但性能会有不同)

r.SeparateTranslucency 这是一个用于修复半透明情况下景深的问题的功能,如果不需要的时候可以把它关闭,并有其他影响(查阅 SceneColor)。

r.Tonemapper.GrainQuantization 用于关闭在 Tonemapper 中添加的噪点来避免 Color Banding,由于 8bit 量化和较小的质量改进在输出为 10:10:10 并不必须。

r.SceneColorFormat 能够选用不同的 SceneColor 格式(默认是 64bit 的最佳质量,并支持屏幕空间子表面散射)。

FX.AllowGPUSorting 禁用粒子排序(在大量粒子的使用可以妥协使用)。

FX.FreezeParticleSimulation 禁止粒子的更新。

r.MaxQualityMode: 最高质量

r.MipMapLODBias: Mipmap Bias

r.MobileContentScaleFactor: 画面缩放比

r.ScreenPercentage: 用于减小内部实际渲染分辨率,画面会在重新放大

r.ShadowQuality: 移动端Stationaary灯光动态阴影质量,调整其值查看帧速变化,以判断瓶颈

r.Shadow.MaxResolution: 移动端Movable灯光动态阴影质量,调整其值查看帧速变化,以判断瓶颈

 

几个对分析最有用的变量:

r.SetRes    改变屏幕,或窗口的分辨率。

r.VSync    开启/关闭垂直同步(可能依赖于是否原生全屏)。

r.ScreenPercentage    用于减小内部实际渲染分辨率,画面会在重新放大。

r.AllowOcclusionQueries    用于禁用遮挡(可以让场景运行的更慢)。

r.TiledDeferredShading    能够关闭基于 Tile 的延迟光照技术(GPU粒子的光影则没有退回方法)。

r.TiledDeferredShading.MinimumCount    能够调整使用多少灯光应用在基于 Tile 的延迟光照技术(视觉上并没有差异但性能会有不同)。

Pause    暂停游戏或者 Matinee(分析时更加稳定,但禁用了 Update/Tick)。

Slomo    能够对游戏进行加速或者减速播放。

r.VisualizeOccludedPrimitives    显示被裁剪掉的物件的外盒框。

StartFPSChart StopFPSChart    请看下文。

r.SeparateTranslucency    这是一个用于修复半透明情况下景深的问题的功能,如果不需要的时候可以把它关闭,并有其他影响(查阅 SceneColor)。

r.Tonemapper.GrainQuantization    用于关闭在 Tonemapper 中添加的噪点来避免 Color Banding,由于 8bit 量化和较小的质量改进在输出为 10:10:10 并不必须。

r.SceneColorFormat    能够选用不同的 SceneColor 格式(默认是 64bit 的最佳质量,并支持屏幕空间子表面散射)。

FX.AllowGPUSorting    禁用粒子排序(在大量粒子的使用可以妥协使用)。

FX.FreezeParticleSimulation    禁止粒子的更新。

r.SSR.MaxRoughness    调整屏幕空间反射(SSR)粗造度的最大值,并覆盖后处理中的该设置。请查阅 Show Flag VisualizeSSR。

 可以快速设置相关瓶颈的总开关来快速定位

 

渲染优化方面

在不需要的地方应该关闭阴影生成( shadow cast),一个个物件的关闭,或者一个个灯光来关闭。

实例化网格     延伸--HLOD

作者:一滴血的记忆

链接:https://zhuanlan.zhihu.com/p/157101737

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

9,实例化静态网格,Instance Static Mesh

默认情况下UE4中的网格体会实例化并保存在内存中,但他们不会在渲染时实例化,这是有区别的内存中实例化意味着如果导入模型它只在内存中存在一次,拖入场景中两次,但内存依然是一份,但是它会渲染两次。模型会在内存中实例化,并不会在渲染时实例化但如果你要进行实例化渲染,它会在两者中都实例化。

进行实例化渲染,只需要将物体添加到实例化静态网格组件中,并按组进行渲染,在实例化以后仿佛就是一个单一模型,有多个对象那么大,事实上仍是一个模型,这样就只需要一次绘制调用,1个drawcall,在api底层其实调用的是drawelementinstance的方法(opengl)。

由于用户界面稍微有点复杂,不太适合在日常工作中对所有对象使用。

另一个原因为什么不对所有对象这么做,默认没有开启的原因,同样也是引擎默认不这么做的原因:因为实例渲染要求每次询问渲染器,当前的和上一个是否一样,意味着每渲染一个对象,都需要检查一下,这个一样吗哪个一样吗等等,如果有大量物体的化,损耗更大相比渲染它而言这也是需要手动指定实例化静态网格的原因,这样就会告诉UE4一个简短列表,执行这个列表里的比较,而不要比较整个场景,让过程变得更快。

UE4 对于植被默认采用的是这种实例化静态网格渲染方式。

实例化网格渲染方式可以渲染海量对象,几乎没有性能损耗。但是不适合于孤立少数的对象,场景中的少数几个没有必要采用,反而会得不偿失。.

 

 

距离剔除

 

 

遮挡处理:

在让渲染线程实际开始渲染画面的时候,我们需要对要渲染的对象进行一个筛选,一个游戏里的世界那么大,可我们玩家所看到的画面只是整个游戏世界中的某一个角度的画面,没必要将那些我们看不到的东西都渲染一遍。所以就要做遮挡处理,将不需要被渲染器渲染的东西,给移除之后,再进行渲染。

遮挡处理部分主要运行在Draw线程,前面说过,它决定了哪些对象最终会参与渲染。

虚幻主要有4种遮挡处理方案。分别是距离剔除,视锥剔除,预计算可见性和遮挡剔除。它们按照性能消耗从小到大的顺序依次执行。

距离剔除:简单点说,就是在场景里放一个大大的Cull Distance Volume(距离剔除体积)盒子,在这个盒子内的所有对象,如果太远,就直接消失掉,不渲染它。视锥剔除:简单点说,视锥其实就是摄像机的视角,像个锥子一样任何没在这个画面中的对象,都会被剔除掉,不参与渲染。值得注意的是,比如你当前的摄像机视角,只看到了一个特别特别大的物体的其中一个三角形,那么这个整个物体也会参与渲染!这就是为什么,天空盒以及地形这种东西,像屎一样甩不掉,总是会被渲染到(所以地形可以分小块做)。预计算可见性剔除:简单点说,还是放一个precomputed visibility volumes盒子到场景中,这个盒子会将自身分割成很多小小的块。小块记住哪些可见,哪些不可见。用得好像不太多。遮挡剔除:这是最后一种方案,也是最耗费性能的一种方案,它会对每一个对象都执行,比如,A可不可见?然后B可不可见?然后C可不可见? 如果场景里有10w个对象,它就得问10w次。

遮挡处理完毕后,就可以把这些最终确认会参与渲染的对象传送给渲染线程进行渲染了。可是,为什么这四种剔除方案要按照性能消耗从小到大的顺序执行呢?

简单点描述就是:用廉价的人干最多的事儿,用最优质的人干最少的事儿。

复杂版本:我说过了,遮挡剔除是很耗费性能的一个过程。所以,假如你的场景中有10w个对象。先用距离剔除把远处的东西给去掉,好,10w个对象变成7w了,然后,利用视锥剔除,再从7w给砍到3w,然后再利用预计算可见性剔除,给看到7k。最后到了遮挡剔除这个步骤的时候,只需要问7k次“你可不可以被看到呀?”,而不是问10w次!

 

 

 

 

 

UE4移动端对渲染效率的影响按照程度排列如下:

材质sample数量大于16

在材质编辑器的

开启后在Stats窗口显示

Sample数量大于16对帧速影响较大

Draw call数量

Drawcall数量直接影响渲染负载,提高渲染效率减少drawcall数量是最直接有效的方法,通过减少模型材质数量或使用编辑器提供的功能, 使用Cull Distance Volume,Precompute visibility Volume,Merge actors都可以减少drawcall数量

动态阴影

包含设置动态阴影属性的物体数量及动态阴影尺寸配置,设置有动态阴影的地物渲染消耗约为没有设置动态阴影的地物的1.5倍,因此尽量减少设置动态阴影

动态阴影图默认为2048,经测试 1024 和 512 的性价比最高

2048 和1024尺寸帧速相差将近10帧

粒子系统meshdata

meshdata在移动端每个粒子的drawcall数量>=1,而其它类型的粒子一般则是一个发射器drawcall>=1,所以应该尽量减少粒子数量减少消耗

贴图尺寸

贴图尺寸不仅影响帧速,而且直接影响游戏安装包及游戏内存占用情况,以及由此延伸而来的内存申请及调度时间消耗

材质复杂度 * 粒子面积 * 粒子数量

材质复杂度不是很高,可是渲染效率依然较低是因为一般情况下粒子系统渲染效率和材质复杂度和粒子面积及粒子数量的积成正比

摄像机视野

摄像机视野直接影响渲染画面里对象的数量,也就是drawcall的数量因此视野越大渲染量越大,从而渲染效率越低

模型面数

模型面数对渲染帧数的影响要小于drawcall,而面数多的时候一般是因为渲染的模型数量多所以drawcall多

发布于 09-03

 

 

移动端的材质设置

 

 

PrePass / Depth only pass: RenderPrePass / FDepthDrawingPolicy 。渲染遮挡物,对景深缓冲区仅输出景深。该通道可以在多种模式下工作:禁用、仅遮蔽,或完全景深,具体取决于活动状态的功能的需要。该通道通常的用途是初始化 Hierarchical Z 以降低 Base 通道的着色消耗(Base 通道的像素着色器消耗非常大)。

Base pass : RenderBasePass / TBasePassDrawingPolicy。渲染不透明和遮盖的材质,向 GBuffer 输出材质属性。光照图贡献和天空光照也会在此计算并加入场景颜色。

Lighting : 阴影图将对各个光照渲染,光照贡献会累加到场景颜色,并使用标准延迟和平铺延迟着色。光照也会在透明光照体积中累加。

Fog : 雾和大气在延迟通道中对不透明表面进行逐个像素计算。

Post Processing : 多种后期处理效果均通过 GBuffers 应用。透明度将合成到场景中。

其中BasePass 0 =不透明网格。

BasePass 1 =用于Z深度的Alpha蒙版不透明网格。

BasePass Dynamic =动画顶点,如Skeletal,GeoCache(Alembic)等。

几个值得注意的数据项:

Base Pass

Deferred Decals

Lighting

SSR(环境反射)

Translucency(半透明)

Postprocessing(后期处理效果)

Particle(粒子)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

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