当前位置:   article > 正文

Unity中的协程_unity协成需要关吗

unity协成需要关吗

一、什么是协程

  1. 协程(Coroutines) 是一种比线程更加轻量级的存在,也被称为用户态线程
  2. 一个进程可以拥有多个线程,一个线程可以拥有多个协程
  3. 协程并不会增加线程,它在线程中运行,通过分时复用的方式运行多个协程,其切换代价比线程切换代价小很多
  4. 协程并非独立与线程,所以协程会因为线程的阻塞而阻塞,往往主线程阻塞时,其协程都会因为阻塞而得不到调度
  5. 因此在协程中不能调用导致线程阻塞的操作,最好与异步IO相结合,比如打印,读取,socket接口等。

二、协程和线程的区别

  1. 线程是操作系统的资源,创建、切换、停止线程都是重量级系统操作,非常消耗资源
    协程的创建不用调度操作系统功能,通常由编程语言自己完成这个工作,相对而言非常轻量级;
  2. 协程通常被创建在主线程上,一个线程上可创建多个协程
  3. 线程之间是并行执行,而协程之间是并发执行的。
    关系描述

三、Unity中协程的调度

基础写法(以打印为例):

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.T))
        {
        	// 字面意思,开启协程
            StartCoroutine(Test01());
        }
    }
    IEnumerator Test01()
    {
        for (int i = 0; i < 10; i++)
        {
        	Debug.Log(i);
        	// 等待一秒后,执行之后的代码,作用类似于延时函数
            yield return new WaitForSeconds(1);
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 上面这段代码中,点击一次T键后,将会以一秒间隔输出i 的值
  • 其中StartCoroutine的意思是开启协程,IEnumerator 的意思就是声明一个协程;开启协程通常不占太多资源,这里可以多按几次,那么你将开启多个Test01协程
  • 协程可以传递参数(不能是ref或out类型),但是没有返回值,它返回迭代器(IEnumerator)到系统内部
  • yield主要形式为:
//计算表达式并以枚举数对象值形式返回,expression 必须是可以隐式转换为迭代器的yield类型
yield return <expression>;	
// 结束迭代,这里用于在协程中内部中断协程
yield break;
  • 1
  • 2
  • 3
  • 4
  • yeild return:把程序控制权交回调用者并保留本地状态,调用者拿到返回值后继续往后执行
  • yeild break:告诉程序当前序列已经结束,相当于正常代码块的return

主要方法

StartCoroutine(func());
StartCoroutine("func Name");
  • 1
  • 2
  • 开启协程:
void Start()
{
    IEnumerator coroutine = Test01(5);
    StartCoroutine(coroutine);	//开启协程
}
 IEnumerator Test01(int a)//协程
 {
     //等待帧画面渲染结束
     yield return new WaitForEndOfFrame();
     a=10;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 关闭协程:
  1. 方法执行完毕自动关闭
  2. 调用StopCoroutine() / StopAllCoroutines(),中止协程
  3. yield break内部中止
    注:协程不会自动停止,需要手动关闭
    例:
void Start()
{
    IEnumerator coroutine = Test01(5);
    StartCoroutine(coroutine);	
    StopCoroutine(coroutine);	//关闭协程
}
 IEnumerator Test01(int a)//协程
 {
     //等待帧画面渲染结束
     yield return new WaitForEndOfFrame();
     a=10;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/126725
推荐阅读
相关标签
  

闽ICP备14008679号