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

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

使用线程的优点就是不会出现界面卡死的情况。假设有一次很大量的运算。没用线程就会出现假死的情况。

以下通过一个简单的样例来说明使用协程的优点:

  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和button,一个button启动协程计算,还有一个直接计算结果。

因为2个方法都是计算相同的结果,计算量比較大。所以直接计算出现了临时的卡死情况。

 

  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的整数时。就返回一次结果,这样能够避免大量的计算卡死。

  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 表示每一帧返回一次结果。

最新文章

  1. 泛型-List&lt;T&gt;
  2. JQuery基础教程:事件(下)
  3. acdream 1681 跳远女王(BFS,暴力)
  4. Apache DbUtils - JDBC轻量级封装的工具包
  5. 设计模式_Decorator_装饰模式
  6. careercup-中等难度 17.11
  7. 异常IllegalStateException终于解决了
  8. SAP自带的创建报表工具
  9. &lt;我的外骨骼,诺基&gt;后的访谈
  10. bug单的生命周期
  11. Python基础之Windows下Python3.x环境搭建
  12. arts打卡 从排序数组中删除重复项
  13. clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop
  14. Core 中 Filter 中相关处理
  15. Delphi事件的广播 转
  16. 基于GitLab与Git Extensions搭建版本控制工具
  17. 【转载】COM 组件设计与应用(一)——起源及复合文件
  18. Spring4.0+quartz2.2.1+memcahce多台nginx实现均衡
  19. 【Python】xlrd,NotImplementedError-formatting_info=True not yet implemented
  20. linux内核介绍

热门文章

  1. netsh http的使用
  2. Rapidjson的简单使用示例
  3. Announcing Zuul: Edge Service in the Cloud--转
  4. Android 使用TabLayout、ViewPager和Fragment实现顶部菜单可滑动切换
  5. 机器学习(三) Jupyter Notebook, numpy和matplotlib的详细使用 (上)
  6. Coderfroces 862 C. Mahmoud and Ehab and the xor
  7. C# DevExpress GridControl使用方法
  8. VUE里子组件获取父组件动态变化的值
  9. Swift学习笔记(2)--元组(Tuples)、Optional(可选值)、(Assertions)断言
  10. Linux局域网登陆响应时间过长