1.什么是协程
协程(Coroutine)是一种轻量级的并发执行方式,它允许程序在执行过程中暂停并恢复,而无需操作系统介入。协程的执行过程更类似于子例程,或者说不带返回值的函数调用。协程完全由程序所控制(在用户态执行),避免了内核态和用户态的切换开销,提高了执行效率
2.协程的应用场景
协程在IO密集型任务中表现尤为出色,能够在IO等待时间切换执行其他任务,从而大大节省资源并提供性能。然而,对于计算密集型任务,协程的来回切换可能会降低性能。
3.如何开启协程
void Start()
{
StartCoroutine("IEnumerable_1");//开启最基本的协程
StartCoroutine("IE_WaitForSeconds");//开启一个等待的协程
StartCoroutine("IE_WaitForFixedUpdate");//开启一个等待FixedUpdate的协程
StartCoroutine("IE_WaitForEndOfFrame");//开启渲染协程
StartCoroutine("IE_Test");//开启协程的嵌套
StartCoroutine("IE_StopIE");//测试停止协程
StartCoroutine("IE_Time");//开启倒计时的协程
}
IEnumerator IEnumerable_1()
{
yield return null;
Debug.Log("最基本的协程 调用了");
}
IEnumerator IE_WaitForSeconds()
{
yield return new WaitForSeconds(5f);
Debug.Log("等待了五秒");
}
//等待FixedUpdate执行完执行
IEnumerator IE_WaitForFixedUpdate()
{
yield return new WaitForFixedUpdate();
Debug.Log("等待FixedUpdate执行完执行");
}
private void FixedUpdate()
{
//Debug.Log("FixedUpdate");//配合第三点测试用的
}
//协程 等待渲染完毕调用
IEnumerator IE_WaitForEndOfFrame()
{
yield return new WaitForEndOfFrame();
Debug.Log("等待渲染完毕");
}
//协程执行完 执行另一个协程
IEnumerator IE_Test()
{
yield return StartCoroutine("IE_Test2");
Debug.Log("开启了Test2协程");
}
IEnumerator IE_Test2()
{
yield return null;
Debug.Log("执行完Test2协程");
}
//停止一个协程
IEnumerator IE_StopIE()
{
int num = 0;
while (num < 10000)
{
num += 1;
Debug.Log(num);//打印小于10000的数字
yield return null;
}
}
//使用协程做一个倒计时
IEnumerator IE_Time()
{
int num = 60;
while (num > 0)
{
num -= 1;
yield return new WaitForSeconds(1f);
Debug.Log(num);
}
}
void Update()
{
Debug.Log("Update");//配合 第一点 测试
//按下空格 停止这个协程
if (Input.GetKeyDown(KeyCode.Space))
{
StopCoroutine("IE_StopIE");
}
}
4.协程与进程、线程的区别:
- 进程:操作系统级别的执行单元,拥有独立的地址空间和系统资源。
- 线程:进程内的执行单元,共享进程的资源,但有独立的执行流。
- 协程:比线程更轻量级的执行单元,完全由程序控制,切换代价小,适用于高并发场景,特别是在IO多路复用中的应用。
5.协程的工作原理
协程在遇到IO阻塞时不会阻塞整个进程,且不需要加锁机制,简化了同步问题。协程的切换是在线程内完成的,涉及的资源较少,切换代价较小。协程本身是非常轻巧的,可以简单理解为只是切换寄存器和协程栈的内容。