예제 #1
0
    private Anonymous_T GetFromPool()
    {
        Anonymous_T t;
        int         cnt = _pool.Count;

        if (cnt > 0)
        {
            t = _pool[cnt - 1];
            _pool.RemoveAt(cnt - 1);
            t.deleted = false;
            t.elapsed = 0;
        }
        else
        {
            t = new Anonymous_T();
        }
        return(t);
    }
예제 #2
0
    private void Update()
    {
        float dt = Time.unscaledDeltaTime;

        Dictionary <TimerCallback, Anonymous_T> .Enumerator iter;

        if (_items.Count > 0)
        {
            iter = _items.GetEnumerator();
            while (iter.MoveNext())
            {
                Anonymous_T i = iter.Current.Value;
                if (i.deleted)
                {
                    _toRemove.Add(i);
                    continue;
                }

                i.elapsed += dt;
                if (i.elapsed < i.interval)
                {
                    continue;
                }

                i.elapsed -= i.interval;
                if (i.elapsed < 0 || i.elapsed > 0.03f)
                {
                    i.elapsed = 0;
                }

                if (i.repeat > 0)
                {
                    i.repeat--;
                    if (i.repeat == 0)
                    {
                        i.deleted = true;
                        _toRemove.Add(i);
                    }
                }
                repeat = i.repeat;
                if (i.callback != null)
                {
                    if (catchCallbackExceptions)
                    {
                        try
                        {
                            i.callback(i.param);
                        }
                        catch (System.Exception e)
                        {
                            i.deleted = true;
                            Debug.LogWarning(" timer(internal=" + i.interval + ", repeat=" + i.repeat + ") callback error > " + e.Message);
                        }
                    }
                    else
                    {
                        i.callback(i.param);
                    }
                }
            }
            iter.Dispose();
        }

        int len = _toRemove.Count;

        if (len > 0)
        {
            for (int k = 0; k < len; k++)
            {
                Anonymous_T i = _toRemove[k];
                if (i.deleted && i.callback != null)
                {
                    _items.Remove(i.callback);
                    ReturnToPool(i);
                }
            }
            _toRemove.Clear();
        }

        if (_toAdd.Count > 0)
        {
            iter = _toAdd.GetEnumerator();
            while (iter.MoveNext())
            {
                _items.Add(iter.Current.Key, iter.Current.Value);
            }
            iter.Dispose();
            _toAdd.Clear();
        }
    }
예제 #3
0
 private void ReturnToPool(Anonymous_T t)
 {
     t.callback = null;
     _pool.Add(t);
 }