当前位置:   article > 正文

Unity协程那些事(四)_unity waitforendofframe

unity waitforendofframe

版权申明:

  • 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明
  • 更多学习资源请加QQ:1517069595获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)

本系列索引:

为什么yield能暂停协程执行

在这里插入图片描述

  • 经过我们的查询可以发现,我们用的Coroutine是继承自YiedInstruction,WaitForSeconds WaitForEndOfFrame也继承自YieldInstruction的,所以我们可以推断出,Unity实际上是可以对所有的继承自YieldInstruction的类去使用协程的,或者说Yied关键字,它对所有的YieldInstruction继承的类都是生效的。

那么为什么是这样呢?我们不能仅仅靠推断就止步,要进一步看看为什么继承自YieldInstruction的类就能够暂停协程的执行呢?下面我们一起来看一看协程的实现原理。

协程的实现原理

在这里插入图片描述

  • 实际上每当我们写了一个叫CountCoroutine的协程时,程序内部并不是生成这样一个函数,而是这样一个类,继承自IEnumerator。所有继承自IEnumerator都有些方法。第一个方法是初始化方法,在C#里专业地叫做构造方法。我们会对这个CountCoroutine做一个初始的设置,设置一个状态机的初始状态,外部传入状态值来赋给成员变量。current代表当前状态值,state代表初始状态值,this则代表了我们的NewBehaviorScript脚本对象。CountCoroutine里用到了变量i,生成的状态机里代码里也有状态i。那么状态机是如何做到我们代码里的每次执行到yield暂停一下,再接着执行循环的呢?实际上是通过MoveNext实现的。
  • 由于协程会生成一个状态类,以上图代码为例,会去new d_1的对象,构造器会去传一个构造参数,值为0。因此当第一次执行循环的时候,num的值也是0,不满足if条件进入else分支,这个分支实际上就是for循环的初始化语句。state=-1就表示我们的协程状态机已经开始运行了。 退出条件是 当i>=10 就return false,MoveNext就不能往下走了,也就是我们的循环结束了。因为i初始化为0,不满足退出条件,它会执行下一条,打印i的值。接着有一条等待语句对应着current=new WaitForSeconds(1),接着状态值变成了1,我们的协程会一直等待1s后执行下一次循环,对应到程序代码就是执行下次MoveNext…

实际上协程可以很好地帮助我们完成多个任务并行执行的功能,但是它的缺点也是非常明显的,所以在大型商业项目上,我们并不会直接使用Unity开发的协程,那么在下一个章节中我们来看看协程都有哪些缺点。

系列配套视频戳这里

更多学习资源请加QQ:1517069595获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/865651
推荐阅读
相关标签
  

闽ICP备14008679号