/// <summary> /// 注销计时器回调 /// </summary> /// <param name="callback"></param> public void Unregister(TimerCallback callback) { if (callback == null) { return; } // 更新中注销计时器回调 if (_inUpdate) { foreach (var v in _timerHandlers) { if (v.Value.callback == callback) { v.Value.removeFlag = true; } } DelayHanlder delayHanlder = _delayHandlerPool.Get(); delayHanlder.callback = callback; delayHanlder.isRemove = true; _delayHanlders.Enqueue(delayHanlder); return; } // 注销计时器回调 TimerHandler timerHandler; _timerHandlers.TryGetValue(callback, out timerHandler); if (timerHandler != null) { _timerHandlers.Remove(callback); _timerHandlerPool.Release(timerHandler); } }
/// <summary> /// 注册计时器回调函数 /// </summary> /// <param name="isFrame"></param> /// <param name="delayTime"></param> /// <param name="callback"></param> /// <param name="count"></param> public void Register(bool isFrame, float delayTime, TimerCallback callback, int count) { if (delayTime <= 0) { App.logManager.Error("TimerManager.Register Error: DelayTime must be greater than 0!"); return; } if (callback == null || count == 0) { return; } // 更新中注册计时器回调 if (_inUpdate) { DelayHanlder delayHanlder = _delayHandlerPool.Get(); delayHanlder.isFrame = isFrame; delayHanlder.callback = callback; delayHanlder.delayTime = delayTime; delayHanlder.count = count; _delayHanlders.Enqueue(delayHanlder); return; } // 判断是否已经注册计时器回调 TimerHandler timerHandler; _timerHandlers.TryGetValue(callback, out timerHandler); if (timerHandler != null) { timerHandler.isFrame = isFrame; timerHandler.delayTime = delayTime; timerHandler.count = count; timerHandler.currentTime = (isFrame ? _currentFrame : _currentTime) + delayTime; return; } // 注册新计时器回调 timerHandler = _timerHandlerPool.Get(); timerHandler.isFrame = isFrame; timerHandler.delayTime = delayTime; timerHandler.callback = callback; timerHandler.count = count; timerHandler.currentTime = (isFrame ? _currentFrame : _currentTime) + delayTime; _timerHandlers[callback] = timerHandler; }
public override void Update(float deltaTime) { _inUpdate = true; _deltaTime = deltaTime; _currentFrame++; _currentTime += deltaTime; if (_time != 0) { float tempTime = Time.realtimeSinceStartup; _time += tempTime - _realTime; _realTime = tempTime; } // 判断超时 if (_timeOut > 0) { if (deltaTime > _timeOut) { foreach (var v in _timerHandlers) { TimerHandler timerHandler = v.Value; double time = timerHandler.isFrame ? _currentFrame : _currentTime; timerHandler.currentTime = time; } DispatchEvent(TimerManagerEventArgs.TIME_OUT); } } TimerCallback callback; foreach (var v in _timerHandlers) { TimerHandler timerHandler = v.Value; if (timerHandler.removeFlag) { continue; } double time = timerHandler.isFrame ? _currentFrame : _currentTime; if (time >= timerHandler.currentTime) { callback = timerHandler.callback; if (callback != null) { while (time >= timerHandler.currentTime && timerHandler.count != 0) { timerHandler.currentTime += timerHandler.delayTime; if (timerHandler.count > 0) { timerHandler.count--; if (timerHandler.count == 0) { Unregister(callback); } } callback.Invoke(); } } } } _inUpdate = false; // 更新注册/注销计时器回调 while (_delayHanlders.Count > 0) { DelayHanlder delayHanlder = _delayHanlders.Dequeue(); callback = delayHanlder.callback; bool isRemove = delayHanlder.isRemove; bool isFrame = delayHanlder.isFrame; float delayTime = delayHanlder.delayTime; int count = delayHanlder.count; _delayHandlerPool.Release(delayHanlder); if (isRemove) { Unregister(callback); } else { Register(isFrame, delayTime, callback, count); } } }