Esempio n. 1
0
        public int Add(int delay, TimeHandle timer)
        {
            var offset = Math.Max(1, (delay - _interval + _jiffies - 1) / _interval);
            var index  = Math.Max((_index + offset) % _slots.Length, 0);

            _slots[index].Add(timer);
            // UnityEngine.Debug.LogWarning($"[wheel#{_depth}:{_index}<range:{_timerange} _interval:{_interval}>] add timer#{timer.id} delay:{delay} to index: {index} offset: {offset}");
            return(index);
        }
Esempio n. 2
0
        public int Add(int delay, TimeHandle timer)
        {
            var offset = (delay - _interval + _jiffies) / _interval;
            var index  = (_index + offset) % _slots.Length;

            _slots[index].Add(timer);
            // Debug.LogWarning($"[wheel#{_depth}:{_index}<range:{_timerange} _interval:{_interval}>] add timer#{timer.id} delay:{delay} to index: {index} offset: {offset}");
            return(index);
        }
Esempio n. 3
0
        private void Rearrange(TimeHandle timer)
        {
            var delay      = Math.Max(0, timer.deadline - _elapsed);
            var wheelCount = _wheels.Length;

            for (var i = 0; i < wheelCount; i++)
            {
                var wheel = _wheels[i];
                if (delay < wheel.range)
                {
                    wheel.Add(delay, timer);
                    // UnityEngine.Debug.Log($"[rearrange] {timer.id} wheel#{i}:{wheel.index}");
                    return;
                }
            }
            _wheels[wheelCount - 1].Add(delay, timer);
            // UnityEngine.Debug.Log($"[rearrange] {timer.id} wheel#{wheelCount - 1}:{_wheels[wheelCount - 1].index}");
        }
Esempio n. 4
0
 public bool Remove(TimeHandle timer)
 {
     if (_timers.Remove(timer))
     {
         timer.slot = null;
         return(true);
     }
     // var size = _timers.Count;
     // for (var i = 0; i < size; ++i)
     // {
     //     var it = _timers[i];
     //     if (it == timer)
     //     {
     //         timer.slot = null;
     //         _timers.RemoveAt(i);
     //         return true;
     //     }
     // }
     return(false);
 }
Esempio n. 5
0
        private TimeHandle GetTimeHandle(ulong id, int delay, bool once, TimeHandleCallback fn)
        {
            var        available = _pool.Count;
            TimeHandle timer;

            if (available > 0)
            {
                timer = _pool[available - 1];
                _pool.RemoveAt(available - 1);
            }
            else
            {
                timer = new TimeHandle();
            }
            timer.id       = id;
            timer.delay    = delay < 0 ? 0 : delay;
            timer.deadline = timer.delay + _elapsed;
            timer.action   = fn;
            timer.once     = once;
            timer.deleted  = false;
            timer.slot     = null;
            return(timer);
        }
Esempio n. 6
0
 public void Add(TimeHandle timer)
 {
     timer.slot = this;
     _timers.Add(timer);
 }