한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

游戏卡顿白皮书 › 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 正常、只有别人的动作滞后,看“主线程数据包处理瓶颈”
确认手段
需在玩家侧环境确认

出处

  1. Introduction to level of detail Unity
    没有 LOD 时,画面上看起来很小的物体也按同样的复杂度绘制;LOD 用来减轻绘制负担
  2. Animation Budget Allocator in Unreal Engine Epic Games
    动态减少骨骼网格体的动画更新(tick),把动画耗时控制在预算之内
  3. PresentMon Capture Application (README-CaptureApplication.md) Intel
    用 FrameTime、CPUBusy、GPUBusy 区分是 CPU 还是 GPU 拖慢了帧
  4. Stat Commands in Unreal Engine Epic Games
    stat Unit:整帧耗时,以及游戏线程、渲染线程、GPU 耗时

相关原因

同一层:L1 客户端游戏进程

其他层中同样导致“一卡一卡”的原因

查看含图示和实验的原卡片