UE4 优化(性能、资源管理、打包等优化)
一、如何查看性能指标
可通过输入命令,在界面上呈现当前软件的性能数据。在游戏运行阶段,可按键盘~
,显示命令输入框。
- 命令
stat fps
,简单输出帧率- 命令stat unit
,输出游戏逻辑线程和渲染线程耗费的时间- 命令stat engine
,输出当前用于计算渲染的三角面数量- 界面Statistics
,可以看到项目所有资源的三角面数- 查看打包耗时,可通过Rider的Log输出或者Log文件(项目路径\Saved\Logs
)
stat unit命令介绍
Frame // 完成一帧花费的总时间 Game // 逻辑线程,CPU处理逻辑的耗时 Draw // 渲染线程,CPU处理图像的耗时 GPU // GPU处理当前图像的耗时,可简单通过stat查看gpu耗时情况 DynRes // 不详
二、性能优化的方式
优化帧率
性能优化,主要还是关注三角面的数量,在我的电脑(显卡1080),面数在小几千万面级别的时候,帧率能达到30。
而优化三角面数量有这几种方式:
- 模型制作LOD。特别是数量多的,如树木和小摆件,这些模型做了LOD后优化效果特别明显。场景里还有建筑模型和地理模型,我们的建筑模型一般在几百到上千万面。制作LOD可以使用UE4自带的LOD生成工具,可自动生成面数为设定百分比的模型,如果自动生成的效果可以接受,保存即可。小物件可以把面数比例设置成1%以下(具体数值需要测试),在距离远的时候看不出区别,距离近的时候看高精模。可以借助
LOD Coloration
显示模式来可以快速定位到未做LOD的模型。- 创建剔除体积(我们项目考虑到需要看到所有模型,未采用这种方式。下面有简单的介绍)。
另外,还可以降低贴图分辨率来提高渲染效率。可通过Lightmap Density
显示模式来判断哪些模型的贴图分辨率过大或者过少。蓝色表示分辨率太低,红色表示太高,目标是调整为绿色到橙色之间。
渲染剔除
遮挡剔除开关:project setting - culling - Occlusion Culling 剔除距离体积:CullDistanceVolume
优化UE4项目启动速度
UE4在启动项目的时候需要构建所有网格体,模型越大花费时间越多,会导致项目启动慢的问题。由于每次设计师导入新的模型或者修改了模型,其他同事都需要花费这个时间来重新构建模型。
**优化方案:**没有很好的解决方案。但我们能做到的是,一个模型尽量一次性优化完一次性提交,避免同一个模型多次修改提交,因为每次提交都会带来重新构建的耗时。
优化打包速度和缩小包容量
UE4默认会打包所有Map,包括新手包的map,而打包这些无用的map会带来很多无用的资源。因而,要提高打包速度和缩小包容量的最好的方法是把需要打包的map添加到打包列表里。 **具体操作:**ProjectSetting - Packaging - 把需要打包的map添加到list of maps to include in a packaged bulid
打包过程分析
打包耗时可以通过Rider
的log输出或者查看Log文件(路径项目路径\Saved\Logs
里面的),里面每条log都有发生时间,简单计算即可算出打包耗时。
打包过程会经历这几个过程:
- BUILD COMMAND STARTED,编译项目代码成可执行文件- COOK COMMAND STARTED, 构建资源文件- STAGE COMMAND STARTED,暂存上面生成的文件- ARCHIVE COMMAND STARTED,生成最后的软件包
耗时比较多的主要是前两个阶段,第一个阶段跟代码有关,第二个阶段跟资源数量有关。代码编过一次后,第二次无需耗费很多时间,大概耗费10来秒即可。而第二个阶段的优化,关键还是要减少资源文件的数量。
采用Jenkins进行持续集成交付
搭建步骤以后再补充一篇文章。
采用Jenkins之后,不但把打包工作交给服务端,还能提高工作流的效率。
打包命令配置介绍:http://wangjie.rocks/2018/08/09/ue4-uat-buildcookrun-cmd/
删除不用资源
使用migrate方法,导出项目使用的map到一个新的content目录,此操作会把map引用的所有资源文件一同导出。接着通过主工程的content目录跟这个新的content目录进行文件对比,这就能找出项目中没有使用的资源,继而进行删除。
三、打包失败处理
代码编译失败
- 编译出错,因为文件名带中文 **异常详情:**编译过程出现乱码,接着很快提示编译失败,但失败提示没有定位到问题(下次遇到再补充更多信息)。 **解决方案:**文件名改名,并且修改git的设置,
git config --global core.quotepath false
(git的修改不确定是否相关)
发版打包失败
- Rider平时编译没问题,但打包版本时报错,还发现Rider重新编译后也会报错
**异常详情:**Rider重新编译报错,说无法打开文件dll,但居然偶尔编译成功;使用UE4打包会报详细点的错误,在log文件里查到编译停在自己写的Cpp,报错为“ProcessResult.StdOut: d:/ue4.23/egine/xxx/PhysXIncludes.h : fatal error C1083” **解决方法:**问题原因是cpp文件导入了异常头文件(写代码时,误调用名字类似的类,rider会自动导入该类的头文件,即使删除了调用的代码,头文件不会自动删除,导致编译时失败),删除即可。 - XXX has an inappropriate outermost, it was probably saved with a deprecated outer
**具体信息:**LogLinker: Error: HOTRELOADED_SceneGameMode_0 has an inappropriate outermost, it was probably saved with a deprecated outer (file: /Projects/Content/Widget/W_Error.uasset) 这个问题是由于W_Error.uasset中使用的SceneGameMode发生改动造成的。
**解决方式:**删除W_Error中所有用到的SceneGameMode,然后重新创建SceneGameMode即可。
- 修改过资源存放的路径,导致很多资源找不到了(材质、贴图等)
**解决方法:**需要重新修改资源的引用。导入资源时最好在一开始就确定好它的位置,后面不要轻易修改。
其他
缓存路径
- 开发项目:项目路径/项目名称/Saved1. 发布版本:C:\Users\你的用户名\AppData\Local\你的项目名称\Saved 网页缓存路径:上述路径/webcache
关闭VSync(Vertical Sync)
Vsync 用于解决屏幕撕裂,在显示器刷新率跟不上三维应用的FPS时,通过限制游戏FPS来解决该问题。一般我们应用达不到屏幕的刷新率,因而可以关闭该功能。 关闭方式:蓝图里有vsync的开关(经测试,默认是关闭的)。还有关闭smooth Frame Rate
。
Profiler工具分析逻辑线程
瓶颈在逻辑线程的分析方式
- 游戏运行过程中,cmd输入"stat startfile",运行一段时间,再输入"stat stopfile",此时会在项目”Saved\Profiling\UnrealStats\“目录里保存运行记录。 1. 回到UE4,打开Windows-DeveloperTools-SessionFrontend,在Profiler界面点击load,加载刚才保存的文件。
待整理
stat game?
分析GPU 快捷键"Ctrl+Shift+,"
参考文档
性能优化官方文档:https://docs.unrealengine.com/zh-CN/Engine/Performance/index.html
Profiler用法:https://blog.csdn.net/xingyali/article/details/82217143
Profiler官方文档:https://docs.unrealengine.com/zh-CN/Engine/Performance/Profiler/index.html
参考: https://blog.csdn.net/killfunst/article/details/112556719