StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程。

在C#中直接有Thread这个线程,但是在unity中有些元素是不能操作的。这个时候可以使用协程来完成。

使用线程的好处就是不会出现界面卡死的情况,如果有一次非常大量的运算,没用线程就会出现假死的情况。

下面通过一个简单的例子来说明使用协程的好处:

[csharp] view plaincopy
  1. void OnGUI()
  2. {
  3. GUI.Label(new Rect(0, 0, 200, 50), "测试1:" + result);
  4. if (GUI.Button(new Rect(0, 100, 100, 50), "开启协程"))
  5. {
  6. StartCoroutine(GetResult());
  7. }
  8. GUI.Label(new Rect(200, 0, 200, 50), "测试2:" + result1);
  9. if (GUI.Button(new Rect(200, 100, 100, 50), "无协程测试"))
  10. {
  11. GetResult1();
  12. }
  13. }

上面的代码表示在GUI中定义2个label和按钮,一个按钮启动协程计算,另一个直接计算结果。由于2个方法都是计算同样的结果,计算量比较大,所以直接计算出现了暂时的卡死情况。

 

[csharp] view plaincopy
  1. float result;
  2. IEnumerator GetResult()
  3. {
  4. for (int i = 0; i < 1000; i++)
  5. {
  6. for (int j = 0; j < 100000; j++)
  7. {
  8. result += (i + j);
  9. }
  10. if(i%100==0)
  11. yield return 1;
  12. }
  13. }

这个方法是协程的写法,在C#中协程要定义为IEnumerator 这个类型,javascript中不需要。

yield return 1;这句话表示返回1帧的结果。在i为100的整数时,就返回一次结果,这样可以避免大量的计算卡死。

[csharp] view plaincopy
  1. float result1;
  2. void GetResult1()
  3. {
  4. for (int i = 0; i < 1000; i++)
  5. {
  6. for (int j = 0; j < 100000; j++)
  7. {
  8. result1 += (i + j);
  9. }
  10. }
  11. }

这个方法就是直接计算结果,由于运算量比较大,所以界面会卡死,这样就可以体现出用协程的好处了。
使用IEnumerator 这个类型时,必须用yield return来返回结果,参数为数字时表示为帧数。
如yield return 1 表示每一帧返回一次结果。

转载于:https://www.cnblogs.com/zhusd/p/3868381.html

关于StartCoroutine的简单线程使用相关推荐

  1. Linux下简单线程池的实现

    线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以 ...

  2. C++多线程快速入门(五)简单线程池设计

    目录 设计思路 主线程运行逻辑 task以及taskpool设计 详细流程讲解 完整代码 打印结果 往期回顾 设计思路 线程池实际上就是一组线程,当我们需要异步执行一些任务时,经常要通过OS频繁创建和 ...

  3. Linux多线程实践(9) --简单线程池的设计与实现

    线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以 ...

  4. 【C++学习】 基于Linux/C++简单线程池的实现

    [C++学习] 基于Linux/C++简单线程池的实现 转载自:https://www.cnblogs.com/alwayswangzi/p/7138154.html 我们知道Java语言对于多线程的 ...

  5. c++11の简单线程管理

    1.简单的例子 #include "stdafx.h" #include <iostream> #include <thread>void function ...

  6. C语言实现简单线程池(转-Newerth)

    有时我们会需要大量线程来处理一些相互独立的任务,为了避免频繁的申请释放线程所带来的开销,我们可以使用线程池.下面是一个C语言实现的简单的线程池. 头文件: 1: #ifndef THREAD_POOL ...

  7. C语言实现简单线程池

    有时我们会需要大量线程来处理一些相互独立的任务,为了避免频繁的申请释放线程所带来的开销,我们可以使用线程池.下面是一个C语言实现的简单的线程池. 头文件: 1: #ifndef THREAD_POOL ...

  8. c++多线程——简单线程池

    安全队列 #include <thread> #include <iostream> #include <atomic> #include <function ...

  9. 多线程爬虫(1)-简单线程和面向对象线程

    1.python线程的简单使用 import time import threadingdef sing(a):for x in range(1,6):print('%s接收过来的参数%s'%(thr ...

最新文章

  1. Revit结构2021专业人士的选择:从入门到专业
  2. WordPress漏洞扫描工具WPScan
  3. BREW中的安全性网络编程
  4. Ubuntu Server 安装部署 Cacti 服务器监控
  5. 优化定制化abap代码必须遵守的经典黄金规则
  6. 简单的Ajax应用实例
  7. Windows下静态链接库的使用
  8. 《南溪的目标检测学习笔记》——训练PyTorch模型遇到显存不足的情况怎么办(“OOM: CUDA out of memory“)
  9. 机器人J中WPR_中国工业机器人的产业链及发展现状分析
  10. JAVA数组——二分查找
  11. 2021美赛成绩查询入口和美赛成绩公布时间
  12. dt100g3什么意思_酷黑滑盖风 金士顿DT100G3优盘评测
  13. 彻底删除vmware
  14. 模拟网络丢包的linux,简述Linux模拟丢包
  15. rails 分页插件 Kaminari 的 数组分页
  16. pycharm激活方法到2099年
  17. cocos2d-x 全面总结--字体描边和制作阴影
  18. python中赋值语句和判断语句结合_Python 3 学习的第二小节——判断赋值语句与简单循环...
  19. tensorflow的数据类型
  20. Oracle操作语句(PL/SQL)创建表空间:第 1 行出现错误: ORA-01119: 创建数据库文件时出错 ORA-27040: 文件创建错误, 无法创建文件OSD-04002: 无法打开文件

热门文章

  1. 怎么让百度快速重新收录
  2. 在SQL Server 2008中配置文件流(FILESTREAM)
  3. 如何在同一台电脑上多个账户同时登陆MSN
  4. LaTeX - 带圈数字
  5. riot.js教程【四】Mixins、HTML内嵌表达式
  6. 新日光Q3收入亏损8400万美元缩水33.85%
  7. 【转载】有软件开发,就要有软件测试!
  8. 【飞行术】Web2.0如何改变电信业
  9. git ssh key创建和github使用
  10. Microsoft Build 2015