定时器中的时间轮算法究竟有多深奥?
摘要:👉 时间轮(Timing Wheel) 是: • 定时器 • 网络框架(Netty) • 游戏服务器 • Unity 战斗BUFF技能CD • 事件调
👉时间轮(Timing Wheel)是:
• 定时器
• 网络框架(Netty)
• 游戏服务器
• Unity 战斗/BUFF/技能/CD
• 事件调度系统
里的核心算法之一,属于**“看似基础,实则是对抽象极好的应用”**的内容。
⏱️ 深入理解定时器中的【时间轮算法】
—— 为什么它是 O(1) 的定时器神器?
一、为什么我们需要时间轮?
先从一个真实问题说起。
🎮 Unity 中的常见定时需求
• 技能 CD(5s、30s、120s)
• BUFF 持续时间
• DOT / HOT
• 延迟事件(3 秒后播放动画)
• 网络心跳 / 超时检测
• AI 行为延迟执行
最直观写法:
List<Timer> timers;
foreach(vartintimers)
{
if(Time.time >= t.TriggerTime)
t.Execute();
}
❌ 问题是什么?
• 每帧遍历所有定时器
• 时间复杂度:O(n)
• n 大了直接炸(服务器尤甚)
二、传统定时器方案对比(为什么不行)
方案
数据结构
插入
触发
问题
List
数组
O(1)
O(n)
每帧扫描
SortedList
有序数组
O(n)
O(1)
插入慢
小顶堆
PriorityQueue
O(log n)
O(log n)
高频触发压力大
红黑树
Tree
O(log n)
O(log n)
实现复杂
👉有没有 O(1) 插入 + O(1) 触发?
答案是:时间轮
三、时间轮的核心思想(一句话版)
用“时间槽”代替“时间点”,
把未来的任务提前放进对应的槽里,
时间走到哪,就只处理那个槽。
