1. Naive Multiple Timer
直观,但是当玩家很多的时候,放上万个Timer显然并不实际
2. Queue
fn ConsumeHP(User user) {
...
if (user.hp < MAX_NATIVE_HP)
queue.push({user,time::now() + FIVE_MINUTES_MS});
}
fn ProduceHP() {
while(!queue.empty() && queue.front().second <= time::now()) {
queue.front().first.hp++;
queue.pop();
}
}
fn threadEntry() {
Timer timer = new Timer(
1000, // First delay
1000, // Routine delay
ProduceHP // timer callback
);
}
这样就能用一个Timer 去loop
效能会不会爆掉就是另一回事 其实我猜几万人的话应该扛得住
3. Check When Change
这个比较难形容
简单来说,客户端这边可以用Naive Timer去算显示的体力
但是后端并不会即时更新
只有在消耗或非自然增加(道具、升级)
或是用户端请求更新(登入、本地Timer callback)的时候才去更新目前的体力
这样就可以减少计算量
实际上应该这种方案比较实际