找回密码
 立即注册
查看: 360|回复: 0

ue4 使用insight查性能问题

[复制链接]
发表于 2022-10-11 10:48 | 显示全部楼层 |阅读模式
问题描述:最近项目在查性能问题,就记录一下过程
用的工具是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流程图(我主要是负责查动画模块的性能问题)



主线程的tick流程图



skeletalMeshComponent的tick流程图

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



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



2.主线程在等渲染线程



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



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



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

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


有几个大的问题
1.MoveComponent 中UpdateChildTransforms更新的开销
2.动画在主线程阶段的开销
3.动画更新完之后UpdateChildTransforms  updateoverlap的开销(感觉和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:[UE4]性能优化指南(程序向)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-21 22:02 , Processed in 0.090374 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表