unity中 一般都用coroutine(协同程序,协程)实现定时任务,自己写Timer and Invoke 也可以实现,主要分析unity中的coroutine的实现原理,
coroutine 比如WaitForSeconds 内部都是迭代后,添加到CallDelay的 中 给DelayedCallManager管理,内部存储结构是一个multiset(讲道理为什么不用map),该定时器的触发条件是CallBack的时间到了,通过长时间线(时间戳)来处理,而不是每一帧Tick一次,排序值就是CallBack的time,这种非顺序容器(物理排列)的一个好处就是在遍历的时候可以动态删除添加,而不影响整体排序值,删除和添加代价都在很小范围内,而不会像vector那样数据前移,基于稳定排序后,在multiset中的排序值始终是按照添加顺序排序(同一个时间戳情况下)。如果排序插入的结果不是稳定 的那么会出BUG,coroutine的调用顺序 一定情况下不会按照StartCoroutine的顺序执行。
即StartCoroutine来做定时任务 并没有性能优势。更多的是写法上的优雅,因此不建议大量使用
TestCode
内部再对WaitForSeconds 添加到定时器任务,达到协同程序的目的
发起添加一个定时器CallBack,coroutine内部IEnumerator后 也是发起calldelayed
如果是0.0f的话,当前Update不处理,下一次Update才处理time=-1f
calback
update
coroutine内部获得 IEnumerator后的处理