@[TOC]进程,线程与协程
九.进程,线程与协程
1.进程
程序的执行单元,是程序执行所需要所有资源的总和,一个进程就相当于是一个程序,一个程序可以起多个进程,解决了多任务并发的问题
PC端多用进程,移动端多用线程
2.线程
程序执行的最小单元,进程包含线程,进程创建的时候会自动创建一个进程,称为主线程
一个进程可以包含多个线程,线程之间也有层级关系,A线程开辟了B线程,当A线程结束的时候,B线程也结束了
理论上说,线程越多,程序执行的效率越高,但是如果无限开辟线程反而会使程序执行效率降低,因为开辟线程需要消耗资源,同时线程会去分掉CPU的时间片
线程之间可以资源共享,而进程不能,为了避免多个线程同时访问一个资源,使用了线程锁,保证了同时只有一个线程访问资源
线程对游戏引擎不友好,游戏中需要执行的任务几乎都需要用主程序来执行
3.协程
协程不是多线程,是运行在主线程中的一个程序
协程每帧执行一次,顺序是Update() -> coroutine -> LateUpdate()
// 动态返回一个枚举器接口的实现类
// 每调用一次yield return,将i加入到一个可枚举的序列里
public IEnumerator GetNumber()
{
for (int i = 0; i < 10; i++)
{
// 输出i
Console.WriteLine(i);
// 动态返回
yield return 0;
}
}
public IEnumerator GetNumber2()
{
for (int i = 0; i < 10; i++)
{
// 输出i
Console.WriteLine(i);
// 每3秒执行一次
yield return new WaitForSeconds(3);
}
}
// 协程的嵌套
public IEnumerator GetNumber3()
{
for (int i = 0; i < 10; i++)
{
// 输出i
Console.WriteLine(i);
// 等待下面的协程执行结束,继续执行
yield return StartCoroutine(GetNumber4());
// 是下面这种写法的简写
// Coroutine t = GetNumber4();
// yield return t;
}
}
public IEnumerator GetNumber4()
{
for (int i = 0; i < 10; i++)
{
// 输出i
Console.WriteLine(i);
yield return 0;
}
}
开启协程
// 用IEnumerator开启协程
StartCoroutine(IEnumerator enumerator);
// 使用方法名开启协程,返回值一定是IEnumerator
StartCoroutine(string MethodName);
StartCoroutine(stirng MethodName, object value);
停止协程
Coroutine t = StartCoroutine(“GetNumber2”);
StopCorountine(t);
// 停止全部的协程
StopAllCoroutine();
// 关键字跳出协程
yield break;
WWW类
数据下载的类,使用它在网络中下载资源,一定要放在协程里面做下载
void Start()
{
string path = “http://…想下载图片的url”;
StartCoroutine(Download(path));
}
private IEnumerator Download(string path)
{
WWW www = new WWW(path);
while(www.isDone == false)
{
// 下载中,打印进度
Debug.Log(www.progress);
yield return 0;
}
// 跳出循环,说明下载完成
}
private IEnumerator Download2(string path)
{
WWW www = new WWW(path);
// 等待下载
yield return www;
// 下载完成
}