原文地址: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常见用法相关推荐

  1. GDScript:协程(Coroutine)(二)简单粗暴实用至上的语法设计

    <GDScript:协程(Coroutine)(一)概念和使用范例 >中介绍了GDScript中协程的概念和简单用法.写完之后总感觉GDScript的协程有哪里不对劲儿,刚才终于琢磨过来& ...

  2. c++ 协程_Python3 协程(coroutine)介绍

    本文首发于 at7h 的个人博客. 目前 Python 语言的协程从实现来说可分为两类: 一种是基于传统生成器的协程,叫做 generator-based coroutines,通过包装 genera ...

  3. lua协程 unity_unity协程coroutine浅析

    一.序言 在unity的游戏开发中,对于异步操作,有一个避免不了的操作: 协程,以前一直理解的懵懵懂懂,最近认真充电了一下,通过前辈的文章大体理解了一下,在这儿抛砖引玉写一些个人理解.当然首先给出几篇 ...

  4. c++ 协程_理解Python协程(Coroutine)

    由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...

  5. python3 协程 写法_理解Python的协程(Coroutine)

    由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...

  6. LUA 协程 Coroutine

    协程 Coroutine 协程(coroutine)并不是 Lua 独有的概念,如果让我用一句话概括,那么大概就是:一种能够在运行途中主动中断,并且能够从中断处恢复运行的特殊函数.(嗯,其实不是函数. ...

  7. C++20中的协程(Coroutine)

    目录 C++20中的协程(Coroutine) 那么,什么是协程? 那么这么好用的协程,是不是只要C++20一推出,我们加上一个关键字就能直接把异步调用转化为同步调用呢? 协程函数和Awaitable ...

  8. tornado协程(coroutine)原理

    tornado中的协程是如何工作的 本文将按以下结构进行组织,说明tornado中协程的执行原理 协程定义 生成器和yield语义 Future对象 ioloop对象 函数装饰器coroutine 总 ...

  9. tornado协程(coroutine)

    tornado中的协程是如何工作的 本文将按以下结构进行组织,说明tornado中协程的执行原理 协程定义 生成器和yield语义 Future对象 ioloop对象 函数装饰器coroutine 总 ...

最新文章

  1. 2021-7-20 Linux服务器终端terminals关不掉怎么办???
  2. css BEM书写规范
  3. BZOJ 5330 Luogu P4607 [SDOI2018]反回文串 (莫比乌斯反演、Pollard Rho算法)
  4. tensorflow中学习率、过拟合、滑动平均的学习
  5. iOS之深入解析Runloop的底层原理
  6. 他复读才考上三本,如今让华为开出201万年薪(其实还拒绝了360万offer)
  7. python setdefault函数_python 字典 setdefault()和get()方法比较详解
  8. c语言编译器环境,C语言教程:C环境设置
  9. UEditor的使用
  10. STM32:红外遥控接收模块
  11. 【OR】YALMIP 鲁棒优化
  12. Java实现学生成绩分析系统
  13. android - studio版本控制文件颜色代表意思
  14. 倾斜摄影当中模型精度和测绘当中的分辨率/比例尺是怎么回事?
  15. Python编码错误的解决办法SyntaxError: Non-ASCII character '\xe5' in file
  16. iOS Charts
  17. 地磅系统——车辆识别系统的自动化管理
  18. 萨尔大学计算机受限,萨尔大学的申请条件
  19. IT经理的两条职业路做管理还是管理咨询
  20. 把Excel批注的“红三角”放在单元格左上角_Excel的批注功能,全部知道的不足10%,你会用的仅仅是冰山一角...

热门文章

  1. 我看无损音频APE和FLAC
  2. 把视频中人的台词去掉且保留背景音乐的方法
  3. 电脑硬件升级完全解决方案2
  4. 极光厂商通道集成指南
  5. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  6. 浅谈精准提取日志中的URL
  7. 外汇和股票有什么区别啊?
  8. 为什么被水弄湿的纸干了后会变皱?
  9. Python爬虫实践:优志愿 院校列表
  10. 华大单片机HC32L130/HC32L136PWM配置