C#知识点讲解之进程,线程,Unity协程的爱恨情仇

今天来讲一讲《进程,线程,Unity协程的爱恨情仇》

前方干货预警,非战斗人员请尽快撤离!

进程process,线程thread,协程coroutine

一、一句话总结:
一般一个应用程序一个进程。一个进程有一个主线程和多个辅助线程,你可以在线程上开启多个协程。

进程有自己独立的栈和堆
线程有自己独立的栈和共享堆
协程有自己独立的栈和共享堆

二、协程和线程的区别:
在执行效率上:就比如说线程ta和线程tb,执行完成各需要10s
1、在单核os中,用的是伪并行,a走一下,挂起,b走一下。中间切换时间0.1s。
那么单核中ta和tb执行完需要10+10+19*0.1=21.9s
而协程就是10+10=20s
2、在多核os中,线程真并行,只要10s
而协程仍然需要10+10=20s
总结:在多核os中,同一时间可以执行多个线程,但同一时间只能执行一个协程。cpu对协程的请求也是一个一个来的。

其他方面:
1、开启一个线程的开销比一个协程大,线程是os级别的概念,协程是编辑器级别的,实现由程序员自己实现
2、线程用于多个关联性不强的工作,而协程主要用于将一个工作分时间片处理。
3、协程执行代码,在yiled之前的跟其他方法没有区别。之后的挂起等待。生命周期大部分都在update和lateupdate之间(个别除外),也就是挂起时每帧都会去看下有没有满足yiled后的条件。
4、Unity中,除主线程外,其他线程无权访问Unity3D的组件、对象和Unity3D系统调用,如果要使用的化, 需要把组件中的数值传到开启的新线程中。

三、Unity是单线程的,避免多线程引发bug不好查找,但Unity是可以支持多线程的,如果同时要处理很多事情或者与Unity对象互动小的可以用thread,否则用coroutine。
C#中的lock关键字
,可用于确保只有一个线程可以在特定事件内访问特定的对象。

下附协程常使用的内容:

yield return null; 下一帧再执行后续代码
yield return 0; 下一帧再执行后续代码
yield return 6;(任意数字) 下一帧再执行后续代码
yield break; 直接结束该协程的后续操作
yield return asyncOperation;等异步操作结束后再执行后续代码
yield return StartCoroution(/*某个协程*/);等待某个协程执行完毕后再执行后续代码
yield return WWW();等待WWW操作完成后再执行后续代码
yield return new WaitForEndOfFrame();等待帧结束,等待直到所有的摄像机和GUI被渲染完成后,在该帧显示在屏幕之前执行
yield return new WaitForSeconds(0.3f);等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间会受到Time.timeScale的影响);
yield return new WaitForSecondsRealtime(0.3f);等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间不受到Time.timeScale的影响);
yield return WaitForFixedUpdate();等待下一次FixedUpdate开始时再执行后续代码
yield return new WaitUntil()将协同执行直到 当输入的参数(或者委托)为true的时候....:yield return new WaitUntil(() => frame >= 10);
yield return new WaitWhile()将协同执行直到 当输入的参数(或者委托)为false的时候....:yield return new WaitWhile(() => frame < 10);
yield return X>5;等待变量x大于5时再执行后续代码
yield return transform.position.y<0;等待物体的高度小于0时再执行后续代码
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章