ainatipen 发表于 2022-6-24 06:51

虚幻性能优化

UE4优化常用方法和工具

Stat命令(不区分大小写)

stat命令对于优化来说是至关重要的,往往在优化的第一步就是通过stat命令来查看各种数据。
stat可以通过编辑器打开也能通过cmd,通过编辑器打开主要就是在视口的左上角的下三角里面。


stat fps
在cmd里面输入stat fps,就可以查看到帧率和渲染一帧花费了多少毫秒。


stat unit
在cmd里面输入stat unit,就可以查看到Frame(渲染一帧时间),Game(游戏线程花费时间),Draw(渲染线程花费时间),GPU(显卡渲染场景花费时间),RHIT(RHI线程花费时间)等信息。


stat game
在cmd里面输入stat game,就可以查看到游戏线程在Tick里面花费的时间。


stat gpu
在cmd里面输入stat game,就可以查看到各个Pass花费的时间。


stat rhi
在cmd里面输入stat rhi,就可以查看到纹理等所占的内存以及绘制数量。


r.ScreenPercentage(r.SetRes 480x270(此命令也是修改分辨率的))
在cmd里面输入r.ScreenPercentage 20(调整屏幕分辨率)(注意得在运行时才有效果),修改分辨率以后,如果您的帧率提高了很多,那么这意味着受像素限制(性能瓶颈在GPU)。


stat startfile和stat stopfile
在cmd里面输入stat startfile,开始统计捕获,在 Profiling 目录中创建一个新文件。


在cmd里面输入stat stopfile,介绍统计捕获。此刻会在项目的Saved文件夹里面创建一个Profiling文件夹,里面就包含了以.ue4stats为后缀的文件,此文件干什么的后面会讲。
freezerendering
在cmd里面输入freezerendering可以冻结渲染,从而可以查看剔除情况。

冻结前
https://www.zhihu.com/video/1521896134552895488

冻结后
https://www.zhihu.com/video/1521896190505000960

Stat SceneRendering
Stat ScreneRendering是唯一可以看到Draw Call的地方,Draw Call是对GPU的一个单一请求,用于绘制一些东西 。当然也是查看时间花费的好地方,比如阴影、贴花、后处理和灯光。


stat命令有很多,暂时列出来了常用的一些,具体的可以参考官方文档。
Show Flags

Show Flags是发现性能问题最简单的方式之一,它可以帮助我们快速找到性能瓶颈。
通过Show Flags我们可以选择启用还是禁用某一部分功能,从而判断影响性能的因素。


Profiler (官方文档)

Profiler可以对CPU和GPU进行分析,Profiler在Session Frontend面板里面,通过Window->Developer Tools->Session Frontend打开。


打开Session Frontend面板以后选择Profiler,点击Load去加载.ue4stats结尾的文件,也就是上面(1.7 stat startfile和stat stopfile)生成的文件。


加载以后就可以对CPU和GPU进行分析了。


GPU Visualizer (官方文档)

GPU Visualizer主要就是对GPU进行分析,打开快捷键Ctrl+Shift+,(注意输入法,英文逗号)。


RenderDoc (官方文档)

RenderDoc是一款图形调试器软件,通过RenderDoc我们可以采集一帧画面进行分析。
Optimization Viewmodes (官方文档)

Light Complexity



光复杂度向我们展示了每个特定光的半径,我们可以看到它们重叠。你可以看到它们重叠的地方成本是如何增加的,那是因为重叠像素用多个光源进行着色。显然,更多的光线重叠意味着更多的性能问题。下图白色的地方是一个特别糟糕的地方。所以这是将一些灯光更改为静态或删除它们的好地方。


Stationary Light Overlap


固定灯(Stationary Light)最多可以同时重叠 4 个(原因是固定光产生的阴影烘焙在光照贴图的四个通道里,第五个没地方放,额外光源就自动转成动态光了。)。一旦有 5个或更多的固定灯光源重叠,半径最小的那个就会开始投射动态阴影,这会带来更高的性能成本。在重建灯时,您也会收到警告。在这里,您可以看到 5个彼此靠近的固定灯。请注意,第一个上面有一个红色的X,表示它现在正在投射动态阴影(也就是变为了动态光源)。
官方文档(这里需要注意的是方向光也算一个,所以下图显示最多重叠3个固定灯,第四个上面已经出现了红色的X)


当您增加重叠的固定灯的数量时,此视图模式会从绿色变为红色。一旦你达到 5个及以上,场景就会变成红色,表明有问题的灯光。有问题的重叠光的半径以红色显示。


Shader Complexity


当涉及渲染像素的复杂性时,我们可以查看着色器复杂性视图。


现在你可以看到这个白色区域是非常非常糟糕。这是因为当涉及到半透明物体时,着色的成本不仅是最近的物体,还有后面的所有物体。
Quad Overdraw


Quad overdraw视图可以查看过度绘制问题。


当我们有多个半透明的东西在彼此后面时,它会变成白色。
蓝图优化

蓝图是跑在虚拟机上的,其实和Java类似(封装的再花里胡哨也终究还是得转换为Native Code)。

[*]复杂逻辑写C++里面不写蓝图里面。
[*]最好不要在蓝图里面使用Tick,可以使用Timers、Timelines等代替。
[*]实在是使用了Tick可以在使用时启用,不使用以后禁用。
[*]调整Tick Frequency,默认情况下是等于0.0=every frame也就是每一帧都调用,如果把它
设置为0.1,那么每秒仅对Actor进行10次Tick。

[*]蓝图很容易生成对彼此的引用,在加载蓝图时,必须加载它引用的所有其它蓝图。
Merge Actor (官方文档)

一个单独的网格可能不能被部分剔除,所以如果它的任何一部分是可见的,整个网格都会渲染(想想整个小米科技园都合并为一个网格,在屏幕上仅仅看见小米科技园的一个角落就需要渲染整个小米科技园,岂不是完犊子了)。由于这个原因,把你的整个关卡都合并成一个单独网格可能不是一个好主意,但是让每一个三角形都成为一个单独网格同样也不是最理想的,所以在两种极端中取得平衡至关重要。
LOD (官方文档)

当玩家靠近您在场景中放置的静态网格模型时,您想要让网格模型看起来非常细致。但是,一旦玩家远离网格模型,您就不需要让网格模型那么细致和复杂了。如果网格模型在屏幕上只占了几个像素的位置,并且玩家几乎看不到它,就没必要让它看起来非常复杂和细致。但是,当玩家靠近网格模型并且能够很清楚地看到它,网格模型就需要细致点了。在 UE4 中,您可在场景中放置一个网格模型,当玩家远离它的时候,可让该网格模型切换为不复杂的网格模型,以便让场景运行得更流畅。您可通过使用 Level of Details 或 LODs 来达到上述效果。
HLOD (官方文档)

HLOD系统可以使用单个经过合并的静态网格体Actor替换远距离上的多个静态网格体Actor。这有助于减少场景中需要渲染的Actor数量,通过降低每帧的绘制调用数量来提升性能。
性能消耗大的函数

GetAllActorofClass(官方文档)
查找指定类的世界中的所有 Actor。这是一个缓慢的操作,谨慎使用,例如不要每一帧使用。
ForLoop
蓝图不能很好的处理循环,对于耗时复杂的逻辑尽量通过C++实现。
SpawnActor (官方文档)
SpawnActor实际上官方已经优化完善了许多,但是在生成Actor的时候还是会占用很多资源,因为这同样需要占用当前平台的IO接口。所以如果你在游戏中需要频繁生成Actor,可以考虑把场景中的Actor保存在缓存池中。
Culling (官方文档)

Distance Culling(官方文档)


距离剔除
https://www.zhihu.com/video/1521897837713010688
View Frustum Culling(官方文档)





Precomputed Visibility Culling(官方文档)
Dynamic Occlusion Culling (官方文档)
定位性能瓶颈

有这么多刨析性能的方法和工具,如何才能快速的定位性能瓶颈?
我们可以通过stat命令快速定位性能瓶颈。
首先要确定瓶颈是在CPU还是GPU,为了找到是谁,在cmd上输入stat unit 命令。屏幕上面会显示相关信息,如下图所示。



Frame时间是产生一帧花的总时间,由于逻辑线程(Game)和渲染线程(Draw)在一帧结束的时候需要同步,一帧花的时间经常跟其中的一个线程花的时间 相近。GPU时间测量了显卡渲染当前场景花的时间。由于 GPU时间是跟当前帧同步的,所以它跟一帧花的时间也基本差不多。
如果一帧花的时间跟逻辑线程的时间比较接近,那么瓶颈在逻辑线程,相反如果跟渲染线程的时间比较接近,那么瓶颈在渲染线程。如果两个时间 都不接近,但跟GPU时间比较接近,那么瓶颈在显卡上。
Game Thread(Code or Blueprint)

优化游戏线程主要关注代码和蓝图
通过~快捷键打开控制台,在里面输入stat startfile,让它运行一会差不多10秒来获取一个多帧的平均值。如果时长过长,那么生成的文件就会很大。通过stat stopfile来结束性能分析。一个后缀为ue4stats的文件就会在工程目录的saved文件夹里面生成。通过window->Developper Tools->Session Frontend打开Session Frontend面板,打开后切换到Profiler面板,通过load来打开ue4stats文件。


当打开后你就可以自己来查看耗费时间的地方了。


当然也可以通过stat game快速定位耗时多的地方。


CPU Render(Object count,draw calls,culling)

优化渲染线程主要关注Draw Calls和剔除等。
在cmd里面输入stat Scenerendering,查看各方面耗时情况,然后有针对性的进行优化。


GPU Render(Shaders,overdraw,lights)

优化显卡渲染主要关注着色器、过度绘制和光照等。
在cmd里面输入stat gpu,查看各方面耗时情况,然后有针对性的进行优化。


参考资料


[*]Performance Optimization for Environments | Inside Unreal
[*]From 0 to 60 FPS in 60 Minutes for Mobile | GitHub 2015 Event Coverage | Unreal Engine
[*]Blueprint Optimization | Live Training | Unreal Engine
[*]Rendering Best Practices | Live Training | Unreal Engine
[*]Hierarchical Level of Detail | Live Training | Unreal Engine
[*]Upcoming Performance Enhancements | Feature Highlight | Unreal Engine
[*]UE4 Performance and Profiling | Unreal Dev Day Montreal 2017 | Unreal Engine
[*]Getting Started with World Composition | Live Training | Unreal Engine
[*]Baking Materials to Textures | Live Training | Unreal Engine
[*]Robo Recall Performance Optimization | Project Spotlight | Unreal Engine
[*]Adjusting Your Content to Perform on Target Hardware | Dev Days 2018 | Unreal Engine
[*]Optimizing UE4 for Fortnite: Battle Royale - Part 1 | GDC 2018 | Unreal Engine
[*]Optimizing UE4 for Fortnite: Battle Royale - Part 2 | GDC 2018 | Unreal Engine
[*]Using the new Proxy Geometry Tool | Live Training | Unreal Engine Livestream
[*]Profiling and Optimization in UE4 | Unreal Indie Dev Days 2019 | Unreal Engine
[*]How Drifter Optimized & Delivered Robo Recall for Oculus Quest | Unreal Dev Days 2019
[*]Understanding Culling Methods | Live Training | Inside Unreal
[*]Optimizing Your Game | Live Training | Unreal Engine Livestream
[*]Engine Tools for Performance on Open World Games | Unreal Fest Europe 2019 | Unreal Engine
[*]UE4 Graphics Profiling: Introduction
[*]如何改善虚幻引擎中的游戏线程CPU性能表现
[*]调试和优化内存
[*]2018TGDC王祢:UE4制作多人大地型游戏的优化 - GameRes游资网
[*]悠米高级技术总监韩天扬:UE4手游如何进行性能优化?
[*]性能优化指南(程序向)
[*]UE4性能分析和优化
[*]测试并优化你的内容
[*]unrealartoptimization
[*]UE4 性能优化方法(工具篇) - 风恋残雪 - 博客园
[*]Epic Games工程师分享:如何在移动平台上做UE4的UI优化?
[*]unreal-engine-performance-guide
[*]UE4-Performance提升
[*]Optimizing and Profiling Games with Unreal Engine 4
页: [1]
查看完整版本: 虚幻性能优化