当前位置:   article > 正文

unity 协程原理与线程的区别_unity线程和协程的区别

unity线程和协程的区别

unity 协程原理与线程的区别

说到协程,我们首先回顾以下线程与进程这两个概念。在操作系统(os)级
别,有进程(process)和线程(thread)两个我们看不到但又实际存在的“东
西”,这两个东西都是用来模拟“并行”的,写操作系统的程序员通过用一定
的策略给不同的进程和线程分配CPU计算资源,来让用户“以为”几个不同的
事情在“同时”进行“。在单CPU上,是os代码强制把一个进程或者线程挂起,
换成另外一个来计算,所以,实际上是串行的,只是“概念上的并行”。在现
在的多核的cpu上,线程可能是“真正并行的”。
1 线程、进程、协程的区别
进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调
度(标准线程是的)。
协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。
一个应用程序一般对应一个进程,一个进程一般有一个主线程,还有若干个辅
助线程,线程之间是平行运行的,在线程里面可以开启协程,让程序在特定的
时间内运行。
协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因
此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU
的能力。
打个比方吧,假设有一个操作系统,是单核的,系统上没有其他的程序需要运
行,有两个线程 A 和 B ,A 和 B 在单独运行时都需要 10 秒来完成自己的任
务,而且任务都是运算操作,A B 之间也没有竞争和共享数据的问题。现在 A
B 两个线程并行,操作系统会不停的在 A B 两个线程之间切换,达到一种伪并
行的效果,假设切换的频率是每秒一次,切换的成本是 0.1 秒(主要是栈切换),
总共需要 20 + 19 * 0.1 = 21.9 秒。如果使用协程的方式,可以先运行协程 A ,
A 结束的时候让位给协程 B ,只发生一次切换,总时间是 20 + 1 * 0.1 = 20.1
秒。如果系统是双核的,而且线程是标准线程,那么 A B 两个线程就可以真并
行,总时间只需要 10 秒,而协程的方案仍然需要 20.1 秒。
在这里插入图片描述
Unity协程执行原理
unity中协程执行过程中,通过yield return XXX,将程序挂起,去执行接下来
的内容,注意协程不是线程,在为遇到yield return XXX语句之前,协程额方
法和一般的方法是相同的,也就是程序在执行到yield return XXX语句之后,
接着才会执行的是 StartCoroutine()方法之后的程序,走的还是单线程模式,
仅仅是将yield return XXX语句之后的内容暂时挂起,等到特定的时间才执
行。
那么挂起的程序什么时候才执行,这就要看monoBehavior的生命周期了。
在这里插入图片描述
也就是协同程序主要是update()方法之后,lateUpdate()方法之前调用的,
接下来我们通过一个小例子去理解一下。

using UnityEngine;
using System.Collections;
using System.Threading;
public class test : MonoBehaviour
{
 void Start()
 {
 StartCoroutine(tt());//
 for (int i = 0; i < 200; i++) //
 {
 Debug.Log("*************************" + i);
 Thread.Sleep(10);
 }
 }
 IEnumerator tt()
 {
 for (int i = 0; i < 100; i++) //
 {
 Debug.Log("-------------------" + i);
 }
 yield return new WaitForSeconds(1); //
 for (int i = 0; i < 100; i++) //
 {
 Debug.Log(">>>>>>>>>>>>>>>>>>>>" + i);
 yield return null; //
 }
 }
 // 
 void Update()
 {
 Debug.Log("Update");
 }
 //
 void LateUpdate()
 {
 Deb
 }
  • 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
  • 33
  • 34
  • 35
  • 36
  • 37

在这里插入图片描述
先执行循环B,然后执行循环A,然后执行update()和lateUpdate()的方
法,等待1S之后,在updat()和lateupda()之间执行循环C的输出。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/126737
推荐阅读
相关标签
  

闽ICP备14008679号