StartCoroutine的使用
StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程。
在C#中直接有Thread这个线程,可是在unity中有些元素是不能操作的。这个时候能够使用协程来完毕。
使用线程的优点就是不会出现界面卡死的情况。假设有一次很大量的运算。没用线程就会出现假死的情况。
以下通过一个简单的样例来说明使用协程的优点:
- void OnGUI()
- {
- GUI.Label(new Rect(0, 0, 200, 50), "測试1:" + result);
- if (GUI.Button(new Rect(0, 100, 100, 50), "开启协程"))
- {
- StartCoroutine(GetResult());
- }
- GUI.Label(new Rect(200, 0, 200, 50), "測试2:" + result1);
- if (GUI.Button(new Rect(200, 100, 100, 50), "无协程測试"))
- {
- GetResult1();
- }
- }
上面的代码表示在GUI中定义2个label和button,一个button启动协程计算,还有一个直接计算结果。
因为2个方法都是计算相同的结果,计算量比較大。所以直接计算出现了临时的卡死情况。
- float result;
- IEnumerator GetResult()
- {
- for (int i = 0; i < 1000; i++)
- {
- for (int j = 0; j < 100000; j++)
- {
- result += (i + j);
- }
- if(i%100==0)
- yield return 1;
- }
- }
这种方法是协程的写法,在C#中协程要定义为IEnumerator 这个类型,javascript中不须要。
yield return 1;这句话表示返回1帧的结果。在i为100的整数时。就返回一次结果,这样能够避免大量的计算卡死。
- float result1;
- void GetResult1()
- {
- for (int i = 0; i < 1000; i++)
- {
- for (int j = 0; j < 100000; j++)
- {
- result1 += (i + j);
- }
- }
- }
这种方法就是直接计算结果,因为运算量比較大。所以界面会卡死,这样就能够体现出用协程的优点了。
使用IEnumerator 这个类型时。必须用yield return来返回结果,參数为数字时表示为帧数。
如yield return 1 表示每一帧返回一次结果。
StartCoroutine的使用的更多相关文章
- 关于StartCoroutine的简单线程使用
StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程. 在C#中直接有Thread这个线程,但是在unity中有些元素是不能操作的.这个时候可以使用协程来完成. 使 ...
- 9. MonoBehaviour.StartCoroutine 开始协同程序
function StartCoroutine (routine : IEnumerator) : Coroutine 描述:开始协同程序. 一个协同程序在执行过程中,可以在任意位置使用yield语句 ...
- 使用startCoroutine制定倒计时
使用startCoroutine制定倒计时 using UnityEngine; using System.Collections; public class TimerCoroutine : Mon ...
- StartCoroutine/StopCoroutineInvoke
本文由博主(YinaPan)原创,转载请注明出处:http://www.cnblogs.com/YinaPan/p/Unity_Coroutine.html using UnityEngine; us ...
- 【错误总结1:unity StartCoroutine 报 NullReferenceException 错误】
今天在一个项目中,写了一个单例的全局类,该类的作用是使用协程加载场景.但在StartCoroutine 这一步报了NullReferenceException 的错.仔细分析和搜索之后,得到错误原因. ...
- StartCoroutine 和 StopCoroutine
我的Unity版本是2017.2.0p4(64-bit) StartCoroutine的两个版本: StartCoroutine(string methodName) StartCoroutine(I ...
- 问题记录,StartCoroutine(“str")问题
StartCoroutine参数为函数字符串名,运行时出错,错误是:无法启动协程函数. 调用格式如下: gameManager.StartCoroutine(LuaOnLevelwasloaded() ...
- unity, StartCoroutine and StopCoroutine
startCoroutine("func",1.0f)可以用stopCoroutine("func")来停. startCoroutine(func(1.0f) ...
- unity关于StartCoroutine的简单线程使用
StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程. 在C#中直接有Thread这个线程,但是在unity中有些元素是不能操作的.这个时候可以使用协程来完成. 使 ...
随机推荐
- 公司采购 流程flowable例子
Name: Flowable BPMN 2.0 designer Location: http://flowable.org/designer/update/ 业务描述:1. 公司采购,因为办公用品价 ...
- POJ 1167 The Buses 暴搜+剪枝
思路: 先把能选的路线都预处理出来 按照能停的车的多少排个序 (剪枝1) 搜搜搜 如果当前剩的车÷当前能停车的多少+deep>=ans剪掉 (剪枝2) //By SiriusRen #inclu ...
- Fishing Net
In a highly modernized fishing village, inhabitants there make a living on fishery. Their major tool ...
- OpenSUSE下支持托盘的邮件客户端Sylpheed
在网上搜索了很多客户端想支持系统托盘,发现一个很不错的邮件客户端Sylpheed.设置方式和foxmail很像,最为重要的是支持系统托盘,很方便,默认没有开启,简单设置下:配置->通用首选项-& ...
- 把书《CUDA By Example an Introduction to General Purpose GPU Programming》读薄
鉴于自己的毕设需要使用GPU CUDA这项技术,想找一本入门的教材,选择了Jason Sanders等所著的书<CUDA By Example an Introduction to Genera ...
- Tomcat线程池与NIO配置
每个web客户端请求对于服务器端来说就一个单独的线程,客户端的请求数量增多将会导致线程数就上去了,CPU就忙着跟线程切换. 而NIO则是使用单线程(单个CPU)或者只使用少量的多线程(多CPU)来接受 ...
- GridControl添加右键菜单
private void gridView1_MouseDown(object sender, MouseEventArgs e) { GridHitInfo vi = gridView1.CalcH ...
- Codeforces 429D Tricky Function 近期点对
题目链接:点击打开链接 暴力出奇迹. 正解应该是近期点对.以i点为x轴,sum[i](前缀和)为y轴,求随意两点间的距离. 先来个科学的暴力代码: #include<stdio.h> #i ...
- php intval函数
php intval函数 作用 intval — 获取变量的整数值 使用实例 <?php echo intval('-42'); // -42 ?> 相似函数 boolval() - 获取 ...
- Lucene 定义
福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...