在第八节消息分发时有下面这个代码
可以看到下面代码中有一个叫做协程锁的组件,并且利用了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。这里可以直接也就是下一个协程