• 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
  • 相关阅读:
    计算机网络-Traffic-Filter流量过滤策略
    如何保证同事的代码不会腐烂?一文带你了解 Alibaba COLA 架构
    Oracle数据库如何定位trace file位置
    Java基础15 内存分析和面向对象
    Mybatis如何批量插入数据?
    【面试题】sychronized
    【集群】LVS+Keepalived群集
    【Spring Cloud】CentOS 安装 DockerCE
    hadoop集群搭建——单节点(伪分布式)
    memcpy的使⽤和模拟实现
  • 原文地址:https://blog.csdn.net/KamikazePilot/article/details/128173280