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); }
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(); } }
private void ReturnToPool(Anonymous_T t) { t.callback = null; _pool.Add(t); }