游戏卡顿白皮书 › 只有部分人遇到的问题
后台窗口处理受限 Background window throttling
原因 ID pt-background · 主责 研发团队·客户端开发 · 配合 外部·外部
在含图示和实验的完整版中打开此卡片 →
处于后台窗口的客户端,游戏、引擎、OS 都会减少它的帧和处理量。收到的包不能及时处理,就会积压或溢出。
起因 游戏选项或显卡驱动的后台帧率限制(例如 NVIDIA 驱动可在每秒 20~200 帧之间指定),省电,引擎的后台暂停设置。OS 也会优先把 CPU、GPU 分给前台窗口 → 结果 每帧处理的包数减少,队列堆积,接收缓冲区溢出后包被丢弃 → 画面表现 窗口切到前台时一下子全冒出来,或者有的 NPC 始终看不到
- 症状
- 隐身/幽灵实体, 快进, 掉线
- 因素
- 停顿, 丢包
- 谁会遇到
- 双开时只有一个客户端
- 何时出现
- 挂机一段时间后, 一直
- 负责方
- 主责 研发团队·客户端开发 · 配合 外部·外部
- 研发团队要做的事
- 网络接收放在与游戏循环分开的线程里持续运行,后台也保证最低处理量,打开引擎的后台运行设置(Unity 为 runInBackground)。
- 外部要做的事
- 引导玩家关闭显卡驱动的后台帧率限制和电脑的省电模式。
- 数值参考
- Unity 的 runInBackground 设置关闭时,窗口一失去焦点,游戏循环就会停住。如果只在这个循环里接收数据,这段时间里包完全得不到处理。
- 监控图上
- 断流后集中到达 · 客户端帧间隔,每帧处理的包数
- 查看位置
- 在同一台电脑上把一个窗口放前台、另一个放后台,互换角色对比。用 PresentMon 测两个进程的帧间隔,有游戏侧日志时看窗口焦点状态和每帧处理的包数
- 确认依据
- 只有在后台窗口时帧间隔大幅增加(驱动限制时会在与设定帧率对应的间隔处走平)或处理停住,切换窗口后问题也转移到另一个客户端
- 排除依据
- 前台窗口同样出现,就不是后台限制造成的。与窗口位置无关、总是同一个客户端异常,看“显示选项不同”或“客户端版本/数据不一致”
- 确认手段
- 需在玩家侧环境确认
出处
- Application.runInBackground Unity
runInBackground 默认为 false,此时应用在后台会暂停 - Manage 3D Settings (reference) — NVIDIA Control Panel Help NVIDIA
Background Application Max Frame Rate:把后台游戏的最高帧率限制在每秒 20~200 帧 - Priority Boosts Microsoft
Windows 会把前台窗口进程的优先级提升到不低于后台进程的水平 - PresentMon README Intel
按应用采集 Windows 图形应用 CPU、GPU、显示帧耗时的工具
相关原因
同一层:只有部分人遇到的问题
其他层中同样导致“隐身/幽灵实体”的原因
查看含图示和实验的原卡片