UE4 项目优化经验(性能、资源管理、打包等优化)

@[toc]

一、如何查看性能指标

可通过输入命令,在界面上呈现当前软件的性能数据。在游戏运行阶段,可按键盘~,显示命令输入框。

  • 命令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即可。

  • 修改过资源存放的路径,导致很多资源找不到了(材质、贴图等)

解决方法:需要重新修改资源的引用。导入资源时最好在一开始就确定好它的位置,后面不要轻易修改。

其他

缓存路径

  1. 开发项目:项目路径/项目名称/Saved
  2. 发布版本:C:\Users\你的用户名\AppData\Local\你的项目名称\Saved
    网页缓存路径:上述路径/webcache

关闭VSync(Vertical Sync)

Vsync 用于解决屏幕撕裂,在显示器刷新率跟不上三维应用的FPS时,通过限制游戏FPS来解决该问题。一般我们应用达不到屏幕的刷新率,因而可以关闭该功能。
关闭方式:蓝图里有vsync的开关(经测试,默认是关闭的)。还有关闭smooth Frame Rate

Profiler工具分析逻辑线程

瓶颈在逻辑线程的分析方式

  1. 游戏运行过程中,cmd输入"stat startfile",运行一段时间,再输入"stat stopfile",此时会在项目”Saved\Profiling\UnrealStats\“目录里保存运行记录。

  2. 回到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

Add a Comment

邮箱地址不会被公开。 必填项已用*标注