简单总结协程Coroutine及Yield常见用法
原文地址:http://blog.csdn.net/qq_18995513/article/details/51944602
最近学习协程Coroutine,参考了别人的文章和视频教程,感觉协程用法还是相当灵活巧妙的,在此简单总结,方便自己以后回顾。
首先是yield return的常见返回值及其作用:
- yield return new WaitForSeconds(3.0f); // 等待3秒,然后继续从此处开始,常用于做定时器
- yield return null; // 这一帧到此暂停,下一帧再从暂停处继续,常用于循环中
- yield return new WaitForEndOfFrame(); // 等到这一帧的cameras和GUI渲染结束后再从此处继续,即等到这帧的末尾再往下运行。这行之后的代码还是在当前帧运行,是在下一帧开始前执行,跟return null很相似
- yield return new WaitForFixedUpdate(); // 在下一次执行FixedUpdate的时候继续执行这段代码,即等一次物理引擎的更新
- yield return www; // 等待直至异步下载完成
- yield break; // 直接跳出协程,对某些判定失败必须跳出的时候,比如加载AssetBundle的时候,WWW失败了,后边加载bundle没有必要了,这时候可以yield break跳出。
- yield return StartCoroutine(methodName); // 等待另一个协程执行完。这是把协程串联起来的关键,常用于让多个协程按顺序逐个运行
然后是协程Coroutine的常见用法:
① 将复杂操作分帧计算。
public class TestStepToCalculate : MonoBehaviour {void Start () {StartCoroutine(Calculate(1000));}IEnumerator Calculate(int times){int num = 0; // 用于控制每帧的计算次数for (int i = 0; i < times; i++){Debug.Log(Mathf.Pow(i, 10)); // 计算i的10次方if (++num >= 10){num = 0;yield return null; // 每帧只计算10次}}}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
② 异步下载。
public class TestAsynDownload : MonoBehaviour {void Start () {StartCoroutine(Work());}IEnumerator Work(){WWW www = WWW("http://www.baidu.com");yield return www; // 等待直至异步下载完成,才继续往下执行Debug.Log(www.text);}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
③ 使用yield return coroutine等待协程,将多个异步逻辑串联。如先进行异步下载,完成下载任务后再接着运算。
public class TestMultipleCoroutine : MonoBehaviour {void Start () {Debug.Log("111");StartCoroutine(Work()); // 文档描述:StartCoroutine function always returns immediatelyDebug.Log("222"); // 即开启协程之后的代码会立刻执行,不会等待协程操作结束后才执行!}IEnumerator Work(){yield return StartCoroutine(Download());yield return StartCoroutine(Calculate(10));Debug.Log("Finish");}IEnumerator Download(){WWW www = new WWW("http://www.baidu.com");yield return www; // 等待直至下载完成Debug.Log(www.text);yield return new WaitForSeconds(3.0f); // 下载完成后再等3秒}IEnumerator Calculate(int times){for (int i = 0; i < times; i++){Debug.Log(Mathf.Pow(i, 10)); // 计算i的10次方yield return null; // 每帧只计算一次}}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
④ 创建互斥区。如某个下载函数同一时刻只能有一个协程进入。
public class TestCriticalSection : MonoBehaviour {private bool isDownloading = false; // 是否有某个协程正在下载中void Start () {StartCoroutine(Download("a"));StartCoroutine(Download("b"));}IEnumerator Download(string path){while(isDownloading){yield return null; // 下一帧继续检测是否还有其他协程正在下载中}isDownloading = true; // 可以开始下载,先修改标记WWW www = new WWW("http://www.baidu.com");yield return www; // 等待直至异步下载完成,才继续往下执行Debug.Log(path);isDownloading = false; // 完成下载后,修改标记}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
⑤ 待续。。。
简单总结协程Coroutine及Yield常见用法相关推荐
- GDScript:协程(Coroutine)(二)简单粗暴实用至上的语法设计
<GDScript:协程(Coroutine)(一)概念和使用范例 >中介绍了GDScript中协程的概念和简单用法.写完之后总感觉GDScript的协程有哪里不对劲儿,刚才终于琢磨过来& ...
- c++ 协程_Python3 协程(coroutine)介绍
本文首发于 at7h 的个人博客. 目前 Python 语言的协程从实现来说可分为两类: 一种是基于传统生成器的协程,叫做 generator-based coroutines,通过包装 genera ...
- lua协程 unity_unity协程coroutine浅析
一.序言 在unity的游戏开发中,对于异步操作,有一个避免不了的操作: 协程,以前一直理解的懵懵懂懂,最近认真充电了一下,通过前辈的文章大体理解了一下,在这儿抛砖引玉写一些个人理解.当然首先给出几篇 ...
- c++ 协程_理解Python协程(Coroutine)
由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...
- python3 协程 写法_理解Python的协程(Coroutine)
由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...
- LUA 协程 Coroutine
协程 Coroutine 协程(coroutine)并不是 Lua 独有的概念,如果让我用一句话概括,那么大概就是:一种能够在运行途中主动中断,并且能够从中断处恢复运行的特殊函数.(嗯,其实不是函数. ...
- C++20中的协程(Coroutine)
目录 C++20中的协程(Coroutine) 那么,什么是协程? 那么这么好用的协程,是不是只要C++20一推出,我们加上一个关键字就能直接把异步调用转化为同步调用呢? 协程函数和Awaitable ...
- tornado协程(coroutine)原理
tornado中的协程是如何工作的 本文将按以下结构进行组织,说明tornado中协程的执行原理 协程定义 生成器和yield语义 Future对象 ioloop对象 函数装饰器coroutine 总 ...
- tornado协程(coroutine)
tornado中的协程是如何工作的 本文将按以下结构进行组织,说明tornado中协程的执行原理 协程定义 生成器和yield语义 Future对象 ioloop对象 函数装饰器coroutine 总 ...
最新文章
- 2021-7-20 Linux服务器终端terminals关不掉怎么办???
- css BEM书写规范
- BZOJ 5330 Luogu P4607 [SDOI2018]反回文串 (莫比乌斯反演、Pollard Rho算法)
- tensorflow中学习率、过拟合、滑动平均的学习
- iOS之深入解析Runloop的底层原理
- 他复读才考上三本,如今让华为开出201万年薪(其实还拒绝了360万offer)
- python setdefault函数_python 字典 setdefault()和get()方法比较详解
- c语言编译器环境,C语言教程:C环境设置
- UEditor的使用
- STM32:红外遥控接收模块
- 【OR】YALMIP 鲁棒优化
- Java实现学生成绩分析系统
- android - studio版本控制文件颜色代表意思
- 倾斜摄影当中模型精度和测绘当中的分辨率/比例尺是怎么回事?
- Python编码错误的解决办法SyntaxError: Non-ASCII character '\xe5' in file
- iOS Charts
- 地磅系统——车辆识别系统的自动化管理
- 萨尔大学计算机受限,萨尔大学的申请条件
- IT经理的两条职业路做管理还是管理咨询
- 把Excel批注的“红三角”放在单元格左上角_Excel的批注功能,全部知道的不足10%,你会用的仅仅是冰山一角...