UE4 性能优化方法(工具篇)
2016-05-11 14:27
507 查看
本文依据UE4官方文档以及官方博客等总结而来,可能不全面,后面会陆续添加。内置工具的详细说明请参考官方文档。
游戏帧率很低,或者有卡顿的现象,可能会有很多原因,这时候不要乱猜,比如是不是人物太多了或者渲染的东西太多了,这样猜意义是不大的,可能会浪费很多时间,但是总找不到点上,当然如果运气好也可以找到瓶颈,这个时候我们可以借助相应的工具来查找性能瓶颈。此处我们仅以UE4来展开讲解。
首先要确定瓶颈是在CPU还是GPU,为了找到是谁,以非debug版本启动你的程序,并且在控制台上输入stat unit 命令,如果是在android平台上可以同时按下四个手指,打开控制台,输入stat unit,它会显示如下图所示:
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142634171-1435771696.png)
Frame时间是产生一帧花的总时间,由于逻辑线程(Game)和渲染线程(Draw)在一帧结束的时候需要同步,一帧花的时间经常跟其中的一个线程花的时间 相近。GPU时间测量了显卡渲染当前场景花的时间。由于 GPU时间是跟当前帧同步的,所以它跟一帧花的时间也基本差不多。
如果一帧花的时间跟逻辑线程的时间比较接近,那么瓶颈在逻辑线程,相反如果跟渲染线程的时间比较接近,那么瓶颈在渲染线程。如果两个时间 都不接近,但跟GPU时间比较接近,那么瓶颈在显卡上。
当然也可以使用一些第三方工具,比如intel vtume,、aqtime等,移动平台上可以使用Apple Instruments、NVIDIA Tegra System Profiler、ARM DS-5等 。
这个时候你就可以使用UnrealFrontEnd(跟UE4Editor在同级目录)来打开分析的结果,或者在UE4Edtior里面通过window-->Developper ToolsàSession Frontend,打开后切换到Profiler面板,通过load来打开ue4stats文件。
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142634905-1157851659.png)
当打开后你就可以自己来查看耗费时间的地方了
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142635687-350602353.png)
如果要查看卡顿,可以在时间线上查看高峰的地方,通过选择Maximum而不是Average,这样它就会显示一些峰值,如下图所示。
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142636265-1994404039.png)
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142636780-468393606.png)
也可以使用一些第三方工具来测试,pc平台上如 Intel GPA、Nvidia NSight visual Studio edition,移动平台比如高通的adreno profiler、NVIDIA Tegra Graphics Debugger、ImgTec PVRTune and PVRTrace、ARM Mali Graphics Debugger等,苹果的XCode等均可以用来分析。
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142637280-1493655327.png)
stat scenerendering
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142638437-2005714317.png)
stat engine
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142640124-1964794924.png)
stat initviews
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142641312-369997360.png)
stat game
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142642843-921788833.png)
Stat Slow
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142643780-254410409.png)
ViewMode ShaderComplexity
Stat UnitGraph
完整的stat命令参考https://docs.unrealengine.com/latest/CHN/Engine/Performance/StatCommands/index.html。
几个对分析最有用的变量:
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。
几个对分析比较有用的开关是:
-NoSound 禁用声音和音乐系统。
-NoTextureStreaming
关闭贴图 steaming(对于隔离问题时很有帮助)。
-NoVerifyGC 否则需要预期在 Release 版本中每 30 秒会遇到的性能波动。
-NoVSync 能够更快的渲染但会导致画面撕裂,尤其是在高帧数下。
-Streaming 在使用 StartFPSChart/StopFPSChart 很有用,能够从一个非 windows 设备上来获取数据并用于进一步检测(假设我们是实时的 cook 数据)。
游戏帧率很低,或者有卡顿的现象,可能会有很多原因,这时候不要乱猜,比如是不是人物太多了或者渲染的东西太多了,这样猜意义是不大的,可能会浪费很多时间,但是总找不到点上,当然如果运气好也可以找到瓶颈,这个时候我们可以借助相应的工具来查找性能瓶颈。此处我们仅以UE4来展开讲解。
首先要确定瓶颈是在CPU还是GPU,为了找到是谁,以非debug版本启动你的程序,并且在控制台上输入stat unit 命令,如果是在android平台上可以同时按下四个手指,打开控制台,输入stat unit,它会显示如下图所示:
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142634171-1435771696.png)
Frame时间是产生一帧花的总时间,由于逻辑线程(Game)和渲染线程(Draw)在一帧结束的时候需要同步,一帧花的时间经常跟其中的一个线程花的时间 相近。GPU时间测量了显卡渲染当前场景花的时间。由于 GPU时间是跟当前帧同步的,所以它跟一帧花的时间也基本差不多。
如果一帧花的时间跟逻辑线程的时间比较接近,那么瓶颈在逻辑线程,相反如果跟渲染线程的时间比较接近,那么瓶颈在渲染线程。如果两个时间 都不接近,但跟GPU时间比较接近,那么瓶颈在显卡上。
当然也可以使用一些第三方工具,比如intel vtume,、aqtime等,移动平台上可以使用Apple Instruments、NVIDIA Tegra System Profiler、ARM DS-5等 。
瓶颈在逻辑线程
可以通过性能分析来确定,通过~打开控制台里面输入"stat startfile",让它运行一会至少10s来获取一个多帧的平均值。如果时长过长,那么生成的文件就会很大。通过stat stopfile来结束性能分析。一个后缀为ue4stats的文件会在工程的路径下产生,如果是android的话会在你安装的目录下面生成 一个profile目录。如果想要查看分析结果,必须把这个文件拷贝到pc上,可以使用adb pull {ue4stats 完整路径} {pc 保存路径}来拷贝文件到pc上。这个时候你就可以使用UnrealFrontEnd(跟UE4Editor在同级目录)来打开分析的结果,或者在UE4Edtior里面通过window-->Developper ToolsàSession Frontend,打开后切换到Profiler面板,通过load来打开ue4stats文件。
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142634905-1157851659.png)
当打开后你就可以自己来查看耗费时间的地方了
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142635687-350602353.png)
如果要查看卡顿,可以在时间线上查看高峰的地方,通过选择Maximum而不是Average,这样它就会显示一些峰值,如下图所示。
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142636265-1994404039.png)
GPU分析
如果是在PC平台上可以使用ProfileGPU命令或者使用快捷键Ctrl+Shift+,![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142636780-468393606.png)
也可以使用一些第三方工具来测试,pc平台上如 Intel GPA、Nvidia NSight visual Studio edition,移动平台比如高通的adreno profiler、NVIDIA Tegra Graphics Debugger、ImgTec PVRTune and PVRTrace、ARM Mali Graphics Debugger等,苹果的XCode等均可以用来分析。
一些常用的命令
stat unit![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142637280-1493655327.png)
stat scenerendering
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142638437-2005714317.png)
stat engine
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142640124-1964794924.png)
stat initviews
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142641312-369997360.png)
stat game
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142642843-921788833.png)
Stat Slow
![](http://images2015.cnblogs.com/blog/155497/201605/155497-20160511142643780-254410409.png)
ViewMode ShaderComplexity
Stat UnitGraph
完整的stat命令参考https://docs.unrealengine.com/latest/CHN/Engine/Performance/StatCommands/index.html。
几个对分析最有用的变量:
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。
命令行选项
有些功能可以在命令行中进行关闭,比如 UE4.exe –NoSound几个对分析比较有用的开关是:
-NoSound 禁用声音和音乐系统。
-NoTextureStreaming
关闭贴图 steaming(对于隔离问题时很有帮助)。
-NoVerifyGC 否则需要预期在 Release 版本中每 30 秒会遇到的性能波动。
-NoVSync 能够更快的渲染但会导致画面撕裂,尤其是在高帧数下。
-Streaming 在使用 StartFPSChart/StopFPSChart 很有用,能够从一个非 windows 设备上来获取数据并用于进一步检测(假设我们是实时的 cook 数据)。
相关文章推荐
- hdu 3836 Equivalent Sets
- pat 1007. Maximum Subsequence Sum (25)
- 优化duilib中的CDateTimeUI控件-修正XP下无法使用的问题
- Hue 可视化的Hadoop架构工具
- 线程中更新 UILabel的text
- org.hibernate.PropertyAccessException: Null value was assigned to a property。。。。完美解决
- NGUI之UIGrid & UITable
- String、StringBuilder、 StringBuffer 深入分析 源码解析
- Elasticsearch之API CUED操作
- IOS 开发中 TableView的文本Cell高度的自适应,UILabel自动换行适应
- Java中String、StringBuilder、 StringBuffer的理解
- Android UI线程
- 将color转为UIImage
- iOS利用九切片进行切图UI不会变形
- UIBarButtonSystemItemFixedSpace
- 【Arduino官方教程第一辑】示例程序 3-6 LED亮度渐隐
- Concurrent包中Queue(2)----ArrayBlockingQueue
- Concurrent包中Queue(1)----LinkedBlockingQueue
- druid 应用到项目中
- StringBuffer、StringBuilder源码分析