Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
0
        /// <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;
        }
Esempio n. 3
0
        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);
                }
            }
        }