StartCoroutine和yield的工作流程
2015-07-10 12:32
239 查看
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和内存负荷而崩溃掉。通常这种情况下可以用一个布尔变量来避免灾难发生。
相关文章推荐
- phalcon url默认形式
- Hession集成Spring + maven依赖通讯comm项目 + 解决@ResponseBody中文乱码
- 访问谷歌的Hosts文件
- Spring结合log4j(slf4j)
- hadoop2.7.1发布
- Python验证码识别的方法
- Struts2数据封装
- 第一次使用ListActivity
- C#中的运算符和表达式
- Apache 隐藏入口文件 index.php
- 如何开发一个自己的 RubyGem?
- nginx安装配置+集群tomcat:Centos和windows环境
- csharp: Export DataSet into Excel and import all the Excel sheets to DataSet
- jQuery 树形结构
- 【翻译】如何在Ext JS 6中使用Fashion美化应用程序
- http://www.gaofeiyu.com/392
- Python实现大文件排序的方法
- 面试技巧之单面
- Nginx 虚拟主机下支持Pathinfo并隐藏入口文件的完整配置
- VIM编辑器