关闭

StartCoroutine和yield的工作流程

标签: coroutineyield协程
467人阅读 评论(0) 收藏 举报
分类:

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和内存负荷而崩溃掉。通常这种情况下可以用一个布尔变量来避免灾难发生。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:41537次
    • 积分:347
    • 等级:
    • 排名:千里之外
    • 原创:25篇
    • 转载:1篇
    • 译文:0篇
    • 评论:4条
    文章存档
    最新评论