前言
在开发游戏中,往往面临一些性能优化问题,会让开发者去定位排查,而此时能使用优秀的工具就能事半功倍。
以下主要讲述CPU相关优化内容
性能优化的流程
性能优化无非上述几个过程
在项目开发中,性能优化需要有严格的标准,不能用感觉,好似,差不多等模糊用词,而应该根据项目情形定下精准指标,例如在5档机默认画质默认帧率下游戏界面打开耗时不超过500ms,实际打斗场景下帧率维持在20帧率以上等。
- 首先当然是定位耗时点,在大部分情形下都是20%的代码占据了80%的耗时,所以在定位耗时点一定要抓住"大头"
- 然后针对"大头"的耗时点进行思考为什么会这样耗时?或是代码写法有待改进?或是CPU计算量太大?或是I/O导致的耗时?...
- 其次针对思考耗时点的结果,例如如果是CPU计算量太大了,是否能离线计算好结果直接使用,亦或者分帧计算,亦或者异步线程中进行计算,再亦或者使用GPU来计算?
- 再次根据提出的修改方案,选择一种进行完成实现。
- 最后需要在目标硬件上进行真机验证
- 验证耗时得到改善并达到标准那皆大欢喜(不做过度优化,因为不少的优化是有代价的,带来的可能是代码不清晰,维护困难等)
- 发现本次解决方案效果不是那么明显,那需要思考解决方案的有效性。
- 发现下降了部分耗时但是还未达到性能标准,就需要重新定位耗时点,抓住大头再进行解决。
定位方法,工具
日志Log(最简单也是最常用的方法)
以插入代码对的方式来统计某代码段的具体时间
- Lua:os.click()
- UE:FPlatformTime::Seconds()
因为本身打印log的方法也有一定消耗,所以埋点的log要具有针对性,并且尽量不要拼接复杂的字符串。
扩展:针对插入代码对的痛点有设计以下工具
快速插入代码对工具
自动埋点(根据经验得出的配置文件),快速埋点,删点工具
UE CommandLine以及部分常用命令
- stat unit
- stat fps
- stat unlua
- MemReport -Full
可以自定义一些CommandLine来统计性能信息,类似于stat startfile与stat endfile
https://docs.unrealengine.com/5.0/zh-CN/stat-commands-in-unreal-engine/
UE常用性能分析工具
UnrealFrontEnd
若引擎源码版本没有,可以自己在引擎目录下进行编辑生成
基本使用方法
参考stat StartFile和stat EndFile
https://docs.unrealengine.com/5.0/zh-CN/stat-commands-in-unreal-engine/
UnrealInsights
若引擎源码版本没有,可以自己在引擎目录下进行编辑生成
基本使用方法
https://docs.unrealengine.com/5.0/zh-CN/unreal-insights-in-unreal-engine/
命令bat
StartAndroidInsightsService.bat
adb push UE4CommandLine_Insight.txt /sdcard/Android/data/com.Calmer.MyAppP/files/UE4Game/UAGame/UE4CommandLine.txt
adb reverse tcp:1980 tcp:1980
adb shell "am force-stop com.Calmer.MyAppP"
adb shell "am start -n com.Calmer.MyAppP/com.epicgames.ue4.GameActivity"
pause
UE4CommandLine_Insight.txt
../../../MyAppP/MyAppP.uproject -tracehost=127.0.0.1 -trace=log,counters,cpu,frame,bookmark,file,loadtime, gpu,rhicommands,rendercommands,object -statnamedevents
将手机链接电脑后,运行StartAndroidInsightsService.bat将相应的UECommandLine写入,就可以在电脑上拿到实时的trace。
快速验证
取日志,取Profile
GetLogsFileFromAndroidDevice.bat
adb pull /sdcard/UE4Game/UAGame/com.Calmer.MyAppP/Saved/Logs
pause
GetProfilingFromAndroidDevice.bat
adb pull /sdcard/Android/data/com.Calmer.MyAppP/files/UE4Game/UAGame/UAGame/Saved/Profiling/
pause
扩展:可以封装CommandLine命令通过Https上传到服务器,再通过服务器下载。
在开发过程中,可能由测试人员发现性能问题,但此时取log或profile文件就需要插上手机数据线再取的,其实有点费力,因此直接通过commandline上传后,需要的开发人员自取会节省时间成本。
热更
UE中资源热更新和Lua热更新方案(UnLua)
热更可以让我们修改得到快速的验证的重要方法,因此掌握热更的方法,以及游戏框架支持热更是必要的。
UMG+Lua方面经验实战
总结
在性能优化的过程中,定位和验证两个环节可以通过使用优秀的工具来提升效率,但思考并提出修改方案和完成方案更加考量开发人员的内力和经验。