处理定时器问题的常规方案是最小堆。该算法综合时间复杂度较高:堆顶元素的时间判定是常数级,但每次触发 tick 后的移除操作是对数级。

在游戏 Gameplay 开发中,定时器的最小触发间隔通常是一帧。在这种前提下,同一帧内的所有定时器都可以被批量触发,而定时器最高频的操作是插入和执行,删除反而很少。

以 100ms 触发一次 tick、每次触发 10 个定时器为例:这 100ms 窗口内到期的所有定时器完全可以一次性批量处理,无需对最小堆查询 10 次再逐一删除 10 次。批量处理的思路从机制上就提供了更高效的可能。

批量处理的核心挑战在于:如何高效地删除某个时间范围内的所有元素。如果用 vector 存储,批量删除的效率会非常糟糕。

这里可以借助哈希桶的思想来解决批量删除问题。

在数据存储结构上还有更多可以做文章的地方:skiplist 适合动态适应和查询离散时间点;数组与链表的组合则可以换取更粗放但高效的内存布局。