ET源码学习(十三):CoroutineLock

2021/7/2 11:24:21

本文主要是介绍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的结果。这里发现。设置结果时,将index+1了。而在看CoroutineLock时发现。CoroutineLock在调用Dispose是会继续调用Notify。这里可以直接也就是下一个协程


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




这篇关于ET源码学习(十三):CoroutineLock的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程