关于StartCoroutine的简单线程使用
2013-07-13 18:03
465 查看
StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程。
在C#中直接有Thread这个线程,但是在unity中有些元素是不能操作的。这个时候可以使用协程来完成。
使用线程的好处就是不会出现界面卡死的情况,如果有一次非常大量的运算,没用线程就会出现假死的情况。
下面通过一个简单的例子来说明使用协程的好处:
[csharp] view plaincopy
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和按钮,一个按钮启动协程计算,另一个直接计算结果。由于2个方法都是计算同样的结果,计算量比较大,所以直接计算出现了暂时的卡死情况。
[csharp] view plaincopy
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的整数时,就返回一次结果,这样可以避免大量的计算卡死。
[csharp] view plaincopy
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 表示每一帧返回一次结果。
在C#中直接有Thread这个线程,但是在unity中有些元素是不能操作的。这个时候可以使用协程来完成。
使用线程的好处就是不会出现界面卡死的情况,如果有一次非常大量的运算,没用线程就会出现假死的情况。
下面通过一个简单的例子来说明使用协程的好处:
[csharp] view plaincopy
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和按钮,一个按钮启动协程计算,另一个直接计算结果。由于2个方法都是计算同样的结果,计算量比较大,所以直接计算出现了暂时的卡死情况。
[csharp] view plaincopy
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的整数时,就返回一次结果,这样可以避免大量的计算卡死。
[csharp] view plaincopy
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的简单线程使用
- 关于StartCoroutine的简单线程使用
- 关于StartCoroutine的简单线程使用
- unity关于StartCoroutine的简单线程使用
- 关于StartCoroutine的简单线程使用
- 关于C#线程,线程池和并行运算的简单使用和对比
- 关于C#线程,线程池和并行运算的简单使用和对比
- 关于C#线程,线程池和并行运算的简单使用和对比
- 一起谈.NET技术,关于C#线程,线程池和并行运算的简单使用和对比
- 关于C#线程,线程池和并行运算的简单使用和对比
- java线程:关于Callable和Future的简单使用:有返回值的线程
- 关于C语言程序条件编译的简单使用方法
- Android使用handler实现简单的定时器,主线程每秒刷新UI
- 关于Hard Code的思考 - 程序员的管理不能简单使用制度
- 关于picasso的简单使用(整理自网络)
- GCD的简单使用,开辟一条新的线程,让上面的任务串行执行
- 关于ListView控件使用的个人总结--以一个简单的新闻客户端开发为例
- 关于使用PRO*C编程的一些简单说明和例子