ET源码学习(十三):CoroutineLock

在第八节消息分发时有下面这个代码


可以看到下面代码中有一个叫做协程锁的组件,并且利用了using包裹起来了,这个就是协程锁。主要用途是确保只有一个协程对对象进行操作。具体可以参考烟雨大佬B站讲解(https://www.bilibili.com/video/BV12J411E7ik


下面来看一下协程锁如何实现的

CoroutineLock继承IDisposable可以使用using并利用Dispose释放
下面可以看到当CoroutineLock被释放时,将会利用携程锁组件进行通知Notify,目前不知道key和index含义



CoroutineLockType



CoroutineLockQueue就是一个排序字典,Value是一个返回CoroutineLock的任务
CoroutineLockQueueType也是一个字典,Value相当于CoroutineLockQueue

CoroutineLockTimer



下面开始看组件的逻辑

属性
list:上面CoroutineLockType有几个这里就有几个CoroutineLockQueueType,并且放进List中。
nextFrameRun:
timers:超时排序字典,key为超时时间
timeOutIds、timerOutTimer、minTime超时相关



方法逻辑

Awake

组件初始化将会根据CoroutineLockType类型个数初始化list。每个类型对应一个CoroutineLockQueueType


Update

从nextFrameRun拿出存储的类型和id开始调用Notify,这个函数放在后面看



TimeoutCheck超时检测,里面写法和TimerComponent很像可以自己看


Wait

这个函数可以看到是这篇文章开头的图片上的await的的函数,可以知道key是actorId
首先去list找到对应类型的CoroutineLockType,如果没有这个id的,那么加入到CoroutineLockType。然后直接返回结果
如果此类型有这个id,创建一个ETTask,并且设置超时时间,最后开始等待这个ETTask完成。



Notify

跟上面差不多通过类型从list取CoroutineLockType, 如果里面没有这ActorId那么就return。
如果有查看CoroutineLockQueue里有东西没,没东西就直接回收。然后判断迭代次数,大于10放到下一帧去执行。
小于10就从CoroutineLockQueue中取出最早放的,设置ETTask<CoroutineLock>的结果。这里发现。设置结果时,将index+1了。而在看CoroutineLock时发现。CoroutineLock在调用Dispose是会继续调用Notify。这里可以直接也就是下一个协程



在捋ET整个流程时候再看实际用途


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容

友情链接更多精彩内容