StartCoroutine和yield的工作流程

原创 2015年07月10日 12:32:09

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

版权声明:请尊重原创内容,转载请注明来源及链接。

相关文章推荐

简单的单态写法

public static GameManager Instance{ get{return instance;} }private static GameManager in...

检测物体是否可见

检测物体整体可见性(包括所有相机,包括Scene视图相机):Void OnBecameVisible()//当物体变的对任何相机可见 Void OnBecameInvisible()//当物体对任何相...

Mathf.PerlinNoise

这个函数会基于一个二维perlin noise图像(本质是算法,并不是真正的生成一张图片),用x和y作为uv坐标(取值范围都是0-1,超出这个范围的情况和uv坐标是一样的,perlin noise图像...

Lerp 实现匀速运动

Mathf.Lerp的常见误用是Update() { Transform.position = new Vector3(transform.position.x, targetPosition...

正交相机中让物体以1:1的尺寸显示出来

正交相机的Size属性要是屏幕纵向分辨率的一半,这样即可实现把物体尺寸以1:1映射到屏幕上。准确说其实并不是1:1,而是是三维世界中一个单位在屏幕上以一个像素显示出来,例如创建一个默认的cube,在屏...

Unity3D中的Coroutine详解

Unity中的Coroutine原理猜测:虚拟机分段执行机制, 同类型嵌套用栈存放实现串行执行. Unity中使用yield Coroutine需要注意的问题

Unity3D: StartCoroutine 和 yield return 深入研究

StartCoroutine和yield return表面意思很好理解,StartCoroutine就是开启一个协程,yield return 是迭代器块返回调用迭代的地方。 是吧?不知道你什么感觉...

IEnumerator/ IEnumerable/ yield return/ StartCoroutine 详解

IEnumerator/ IEnumerablepublic interface IEnumerable { IEnumerator GetEnumerator(); } ...

【学习笔记】Unity StartCoroutine 中 yield return 总结

Unity 中协程是个非常强大的功能,其作用主要是用于游戏中的延时调用或者执行一连串的有时间间隔的事件流程,例如剧情对话等。           看过几篇大佬的文章后,我简单总结了几点协程相关的知识点...

Unity StartCoroutine 和 yield return 深入研究

StartCoroutine和yield return表面意思很好理解,StartCoroutine就是开启一个协程,yield return 是迭代器块返回调用迭代的地方。 是吧?不知道你什么感觉,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)