unity 携程

http://blog.youkuaiyun.com/huang9012/article/details/29595747


unity3d官方对于协程的解释是:一个协同程序在执行过程中,可以在任意位置使用yield语句。yield的返回值控制何时恢复协同程序向下执行。协同程序在对象自有帧执行过程中堪称优秀。协同程序在性能上没有更多的开销。StartCoroutine函数是立刻返回的,但是yield可以延迟结果。直到协同程序执行完毕。

yield能干的事情远远不止这种简单的特定时间的延时,例如可以在下一帧继续执行这段代码(yield return null),可以在下一次执行FixedUpdate的时候继续执行这段代码(yield new WaitForFixedUpdate ();),可以让异步操作(如LoadLevelAsync)在完成以后继续执行


协程原理分析

  本段内容转自这篇博客,想看的童鞋自己点击。

  首先,请你牢记:协程不是线程,也不是异步执行的。协程和 MonoBehaviour 的 Update函数一样也是在MainThread中执行的。使用协程你不用考虑同步和锁的问题。

  UnityGems.com给出了协程的定义:

  A coroutine is a function that is executed partially and, presuming suitable conditions are met, will be resumed at some point in the future until its work is done.

  协程是一个分部执行,遇到条件(yield return 语句)会挂起,直到条件满足才会被唤醒继续执行后面的代码。Unity在每一帧(Frame)都会去处理对象上的协程。Unity主要是在Update后去处理协程(检查协程的条件是否满足):

  从上图的剖析就明白,协程跟Update()其实一样的,都是Unity每帧对会去处理的函数(如果有的话)。如果MonoBehaviour 是处于激活(active)状态的而且yield的条件满足,就会协程方法的后面代码。还可以发现:如果在一个对象的前期调用协程,协程会立即运行到第一个 yield return 语句处,如果是 yield return null ,就会在同一帧再次被唤醒。如果没有考虑这个细节就会出现一些奇怪的问题。
  注:图和结论都是从UnityGems.com 上得来的,经过验证发现与实际不符,D.S.Qiu用的是Unity 4.3.4f1 进行测试的。经过测试验证,协程至少是每帧的LateUpdate()后去运行

  协程其实就是一个IEnumerator(迭代器),IEnumerator 接口有两个方法 Current 和 MoveNext() ,迭代器方法运行到 yield return 语句时,会返回一个expression表达式并保留当前在代码中的位置。 当下次调用迭代器函数时执行从该位置重新启动。unity3d在每帧做的工作就是:调用协程(迭代器)MoveNext() 方法,如果返回 true ,就从当前位置继续往下执行。详情见这篇博客

 

  如果理解了这张图,之前显示人物对话的功能最后提到的那些疑惑也就很容易理解了:

  • 协程和Update()一样更新,自然可以使用Time.deltaTime了,而且这个Time.deltaTime和在Update()当中使用是一样的效果(使用yield return null的情况下)
  • 协程并不是多线程,它和Update()一样是在主线程中执行的,所以不需要处理线程的同步与互斥问题
  • yield return null其实没什么神奇的,只是unity3d封装以后,这个协程在下一帧就被自动调用了
  • 可以理解为ShowDialog()构造了一个自己的Update(),因为yield return null让这个函数每帧都被调用了

Unity 携程(Coroutine)是一种协同处理机制,它允许程序在特定的时间点暂停执行,然后在稍后的时间点继续执行。这一机制使得程序可以在多个任务之间进行切换,以便实现复杂的异步操作。 Unity 携程的实现原理如下: 1. 携程是基于迭代器(Iterator)的。在编写携程时,开发者可以使用 yield 关键字来指示程序在当前位置挂起,并将执行权返回到 Unity 引擎。这个过程实际上会生成一个迭代器对象,迭代器对象会记录程序的执行状态。 2. Unity 引擎在执行携程时会不断调用迭代器的 MoveNext() 方法。这个方法会根据携程的执行状态来判断程序是否需要继续执行,或者暂停并等待某些条件满足。 3. 当携程需要暂停时,它会通过 yield return 关键字将当前的执行状态返回给 Unity 引擎。这个执行状态包含了一个等待时间或条件,Unity 引擎会根据这个状态来安排携程的下一次执行。 4. 当等待时间或条件满足时,Unity 引擎会再次调用迭代器的 MoveNext() 方法,携程会从上一次暂停的位置继续执行下去。 通过这样的机制,携程使得程序可以在挂起和继续执行之间灵活切换,从而实现了一种协同处理的能力。这对于处理长时间运行的任务、异步加载资源或者并行执行多个任务时都非常有用。 需要注意的是,Unity 携程并不是真正的多线程。它在主线程中以协同的方式运行,因此携程中不能有耗时的操作,否则会阻塞主线程的执行。在需要进行耗时操作的情况下,可以使用 Unity 的其他机制,如线程、任务等来完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值