fwalker 发表于 2022-10-11 10:48

ue4 使用insight查性能问题

问题描述:最近项目在查性能问题,就记录一下过程
用的工具是unreal自带的insight,ios版本的话,我喜欢用的方式是tracefile的方式
具体流程是:
前提准备
1.pc上安装爱思助手
2.安装的游戏包为development版本 而不是shipping版本
例子:角色拔刀会卡顿
流程:

[*]建立一个ue4commandline.txt文件   内容: ../../../gameClient/gameClient.uproject -trace=cpu,frame,bookmark,gpu,loadtime,file,net,log -statnamedevents -tracefile=bb.utrace
通过爱思助手放入游戏目录



[*]手机上启动游戏 这时是一直在录制性能数据的 如果想要方便在卡顿的地方再执行录制 先停止录制(trace.stop)
[*]在发生卡顿之前(角色拔刀之前),执行trace.start default 继续录制
[*]继续跑游戏 角色进行拔刀
[*]拔刀结束后,点击结束性能数据录制(执行trace.stop)
[*]这个时候手机连上pc,打开爱思助手 -应用游戏- MyGame 点击 浏览
[*]Documents/MyGame/Saved/Profiling/*.utrace (默认是bb.utrace)
找到刚才录制的那个文件拷出来,通过insight打开*.utrace文件,分析卡顿的原因了
这个方式的好处是测试人员在遇到卡顿的时候就可以录下来utrace文件 直接发给开发人员查bug了
然后就是进行问题分析了,问题分析之前最好是了解ue的整个tick过程
参考了大神quabqi的文章quabqi:UE4的执行流程和CPU优化 我也画了一遍主线程的tick流程图和skeletalMeshComponent的tick流程图(我主要是负责查动画模块的性能问题)

http://pic2.zhimg.com/v2-9b758d267d3a404dc7b20ae87c4cf0c5_r.jpg

主线程的tick流程图

http://pic3.zhimg.com/v2-c9915bd64888b342cbf86d97984b25a6_r.jpg

skeletalMeshComponent的tick流程图

了解了tick的各个步骤之后,我们去看insight的时候就能比较清晰的知道问题所在 明白各个线程都在干什么
比如:



1.主线程在endphysics的地方等待物理线程执行完毕



2.主线程在等渲染线程



3.主线程向渲染线程插入任务Command



4主线程先work线程插入动画更新任务



5.主线程被物理线程卡住

偶尔卡顿的问题比较容易解决,主要关注的一个问题是prephysics执行的时间过长,


有几个大的问题
1.MoveComponent 中UpdateChildTransforms更新的开销
2.动画在主线程阶段的开销
3.动画更新完之后UpdateChildTransformsupdateoverlap的开销(感觉和1可以合并)
4.茫茫多的ticktask
对应的解决方法我想到的是:
1.减少Scene Component的数量,敌兵的模型是通过头 躯干 头发 腿 脚 等等10几个部件组成的模型,这个可以通过runtimeMesh 合并的方式合成两个模型(一般头的模型不合进去),上一个项目我做过这个事情,可以把模型 材质 贴图都合成一个,也可以根据游戏的gameplay去动态attach/detach SceneComponent
粒子 音效使用Auto Manage Attachment 可以自动根据它是否激活的状态,决定是否挂在父级Scene Component
2.动画部分可以使用URO来减少每帧更新的动画数量,也可以用Animation Budget Allocator来控制动画部分的总开销不重要的npc设置为onlytickposewhenrendered
3.敌兵的物理也做的相当精细,分了12个部位,从而可以获得准确的击中部位判断,但也导致了动画更新完之后这些物理部位也要更新transform,敌兵多了更新压力也比较大 这个可能要精简一下 或者根据重要度做一个lod,简化成2到3个部位,不需要产生Overlap的事件关掉 需要进一步研究怎么去做(到时候做好了再来更新)
4.可以使用Significance Manager根据距离,屏占比,是否可见来给tick的对象排队,然后来控制这些对象的tick频率,减少每帧更新的对象数量
5.看到有些文章实现了动画的全异步更新,需要详细了解下原理和实现方法
待做完优化更新,欢迎指正或者指导优化方法....

知识点记录:
tick.LogTicks 可以打印每帧tick的所有对象
tick.ShowPrerequistes 是否显示Tick依赖
使用unlua的话 可以 quabqi:使用UE4/UE5的stat监控Lua的性能添加lua的性能监视
可以参考 DynamicStatsHelper 来动态添加statid 从而在insight中可以详细查看造成卡顿的资源名字,比如之前我曾用这个方法查游戏中同步加载某个资源造成卡顿的bug
insight可以双击任意统计项 查看开销的曲线变化 从而找到卡顿点f键直接聚焦当前帧的开销区域
参考:
UE4 Tick机制 - 可可西 - 博客园
https://docs.unrealengine.com/4.27/en-US/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Actors/Ticking/
quabqi:UE4的执行流程和CPU优化
quabqi:UE4/UE5 动画的原理和性能优化
老谭:UE4 Tick、TaskGraph与NamedThread调度
qbkivlin:UE4 关于主循环的资料
https://gameinstitute.qq.com/course/detail/10131
玄冬Wong:性能优化指南(程序向)
页: [1]
查看完整版本: ue4 使用insight查性能问题