游戏卡顿白皮书 › L1 客户端游戏进程
大规模同屏渲染负载 Render/animation cost of crowds
原因 ID cg-crowd · 主责 研发团队·客户端开发
在含图示和实验的完整版中打开此卡片 →
攻城战、世界 BOSS 这类数百人同屏的场景,光是绘制开销就承受不住。
起因 同一画面里数百人和特效叠在一起 → 结果 动画、阴影、头顶名字、特效的开销随人数成比例增加 → 画面表现 FPS 从 60 掉到 15,所有动作一卡一卡,操作也有延迟
- 症状
- 一卡一卡, 操作延迟
- 因素
- 停顿
- 谁会遇到
- 特定地点/分线, 只有我
- 何时出现
- 人多的时候
- 负责方
- 主责 研发团队·客户端开发
- 研发团队要做的事
- 按距离简化(LOD),限制显示人数上限,提供特效简化选项,降低动画更新频率。
- 数值参考
- 即使每个角色只要 0.02~0.1 ms,300 人就是 6~30 ms。60 FPS 的帧预算是 16.7 ms,光这一项就占去 1/3 以上,多时直接超出预算。
- 监控图上
- 随人数/负载上升 · 帧耗时、画面内角色数
- 查看位置
- 对比攻城战、世界 BOSS 前后 PresentMon 的帧耗时和 CPUBusy、GPUBusy。开发版本中看 Unreal stat Unit(游戏线程、渲染线程、GPU 耗时)
- 确认依据
- 画面内人数越多帧耗时越高,开启显示人数限制或特效简化选项后立刻好转
- 排除依据
- 与人数无关地冲高,看“帧耗时尖峰”或“客户端垃圾回收”。FPS 正常、只有别人的动作滞后,看“主线程数据包处理瓶颈”
- 确认手段
- 需在玩家侧环境确认
出处
- Introduction to level of detail Unity
没有 LOD 时,画面上看起来很小的物体也按同样的复杂度绘制;LOD 用来减轻绘制负担 - Animation Budget Allocator in Unreal Engine Epic Games
动态减少骨骼网格体的动画更新(tick),把动画耗时控制在预算之内 - PresentMon Capture Application (README-CaptureApplication.md) Intel
用 FrameTime、CPUBusy、GPUBusy 区分是 CPU 还是 GPU 拖慢了帧 - Stat Commands in Unreal Engine Epic Games
stat Unit:整帧耗时,以及游戏线程、渲染线程、GPU 耗时
相关原因
同一层:L1 客户端游戏进程
其他层中同样导致“一卡一卡”的原因
查看含图示和实验的原卡片