ET框架学习——TimerComponent类和有序MultiMap类

       Game类中总共有4个实例对象:Scene对象, EventSystem对象,ObjectPool对象,Hotfix对象。Scene对象实例化成为单例,实例化是,会默认添加一个TimerComponent组件。

       TimerComponent组件继承自Component,内部维护一个字典Dictionary<long, Timer>  timersTimer是一个结构体,包含长整型的Id和Time两个字段,以及一个TaskCompletionSource<bool> tcs对象。

01

一个自定义的数据结构MultiMap<long, long> timeId,键是time,值是timerId。两个Queue<long>,timeOutTimetimeOutTimerId

01

       MultiMap<T, K> 泛型类,是一个自定义的数据结构。内部是基于SortedDictionary<T, List<K>> dictionary实现的。同时内部还有一个Queue<List<K>> queue。Add(T t, K k)方法,向SortedDictionary中添加键值对,值得注意的是,如果对应的值没有在字典中,并且Queue中元素个数不为0,则会将Queue中的对头的元素取出,清空后,添加k值后,将其添加到字典中。这意味着,queue中的元素会和字典中的元素成反增长趋势,这样就可以起到重用list了,而不是每次添加元素,都去申请一个新的list对象。Remove(T t, K k)移除指定键值,如果t对应list为空或者list中没有k都会返回假,当list的长度为0时,会从字典中移除键,并且将该list添加到queue中去,实现复用。

01

还有一些获取元素的方法,包含元素的方法等。

       TimerComponent中的Updata方法应该是一直会跑的。当中会获取当前时间,该时间去和timeId中的键轮询比较,如果键大于该时间,就将键存储为minTime,同时将小于该时间的键保存到timeOutTime中去。timeOutTime中元素个数不为0时,不断取出元素,将timeId中对应键的list元素放入到timeOutTimerId中去,同时从timeId中移除对应的键。当timeOutTimerId元素不为空时,不断取出元素,如果timers中存在对应的键,则将其移除,并且将对应值的tcs置为真。Updata方法主要目的就是将小于timeId中键小于当前时间的值在timers中对应值的tcs置为真。

01

       WaitTillAsync重载方法接受一个长整型参数tillTime(或者CanclelationToken类型参数用于取消操作)。该方法向timerIdtimer中添加元素。同时向CanclelationToken中注册一个Remove方法,移除timer中的指定的键。

       WaitAsync重载方法接受一个长整型参数time(或者CanclelationToken类型参数用于取消操作)。功能和WaitTillAsync方法一样

猜你喜欢

转载自blog.csdn.net/Tong1993222/article/details/82183839