安宁技术博客

UE4 U3D VR

StartCoroutine和yield的工作流程

Yield 返回的是空值

如果yield 返回的是空(C#中是 yield return null, js中是yield),coroutine会被终止,控制权交回调用的位置,就像coroutine结束了一样——事实上它还处于活动状态。 下一帧 coroutine会自动在yield的位置执行,直到Coroutine结束为止。

举例:

Ienumerator Test()
{
    Print(Time.time); //第一次打印时间
    Yield return null;
    Print(Time.time); //第二帧时执行,所以时间要比第一次晚一些
}

如果yield 到另外一个coroutine, 控制权就会传递给这个coroutine,调用者的coroutine会被终止在这个yield直到被调用的coroutine结束

yield return StartCoroutine(AnotherCoroutine());

Yield返回的值非空

比如常见的

yield return new WaitForEndOfFrame();//等到该帧结束
yield return new WaitforSeconds(xxx);//等xxx秒
yield return new WaitForFixedUpdate();//等物理帧结束
yield return www;//这里www是一个WWW对象

总提来说,只要返回的值非空,yield 语句的作用就是让coroutine在这里暂停,主线程继续,直到yield的条件得到满足,再继续执行yield后面的代码。

有了这个认识,其实上面的四种情况都是一样的。
前三个分别是等到该帧结束、等xxx秒、等物理帧结束,其实都是满足了 new WaitForXXX的这个条件。而最后一个www,则是等www加载完成,也就是www可以访问了,条件满足了。

另外需要注意的是,每个开启的coroutine会在堆中分配一个对象,并且会一直存在直到结尾。在周期性的函数中(例如Update,FixedUpdate, LateUpdate)开启coroutine一定要警惕,因为你可能会平行运行数以千计的coroutine,占据大量内存空间。帧率会直降,Unity也可能会因为CPU和内存负荷而崩溃掉。通常这种情况下可以用一个布尔变量来避免灾难发生。

阅读更多
版权声明:请尊重原创内容,转载请注明来源及链接。 https://blog.csdn.net/inlet511/article/details/46829211
文章标签: coroutine yield 协程
个人分类: Unity3D编程
上一篇Mathf.PerlinNoise
下一篇正交相机中让物体以1:1的尺寸显示出来
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭