游戏卡顿白皮书 › L9 服务器游戏进程
实体堆积(未清理的物品/召唤物) Entity / timer buildup over uptime
原因 ID sp-entity-buildup · 主责 研发团队·服务器开发
在含图示和实验的完整版中打开此卡片 →
本该消失的地面物品、召唤物、已结束的定时器没有被清理而不断堆积,服务器开得越久,每个 tick 要做的事就越多。
起因 地面物品、召唤物、过期定时器、空队伍信息没有及时删除 → 结果 每个 tick 要遍历的列表一天比一天长 → 画面表现 维护刚结束时正常,过几天后只有那台服务器或那个区域越来越迟钝
- 症状
- 慢动作, 一卡一卡, 操作延迟
- 因素
- 停顿
- 谁会遇到
- 全服, 特定地点/分线
- 何时出现
- 开得越久越严重
- 负责方
- 主责 研发团队·服务器开发
- 研发团队要做的事
- 把各区域的实体数记为指标观察趋势;给每个实体设寿命和数量上限;定期清理。
- 数值参考
- 每个 tick 都把所有实体遍历一遍的服务器,实体数翻倍,这部分的 tick 耗时也会翻倍。
- 监控图上
- 缓慢上升后骤降 · 各场景实体数、服务器 tick 耗时
- 查看位置
- 以比维护周期更长的时间范围(几周)查看各场景、各服务器的实体数(地面物品、召唤物、定时器)和 tick 耗时
- 确认依据
- 维护后从低位起步的实体数和 tick 耗时每天上涨,在维护、重启时骤降,如此反复,期间内存充足
- 排除依据
- tick 不变而只有内存持续上涨,看“内存泄漏”
- 确认手段
- 需要游戏服务器/客户端的日志和指标
- 深入了解
- 和内存泄漏一样,服务器开得越久越糟,区别在于内存充足、只有 tick 耗时在增加。实体数曲线随维护周期呈锯齿状,就是这种情况。
出处
- Actor Ticking in Unreal Engine Epic Games
Actor、组件如果不单独设定间隔,每帧都会 tick 一次;不需要时可以关闭 tick - AActor::SetLifeSpan Epic Games
给 Actor 设定寿命,到期时会自动销毁
相关原因
同一层:L9 服务器游戏进程
其他层中同样导致“慢动作”的原因
查看含图示和实验的原卡片