• Unity-协同程序


     知识点一 Unity是否支持多线程

    1、首先要明确一点Unity是支持多线程的,只是新开线程无法访问Unity相关对象的内容

    ******Unity中的多线程 要记住关闭***********

    Unity中去使用:

    如果说,我们一开始在Start内创建一个多线程,那么我们无法在start外得到以及销毁它。

     因此我们大部分时候在类中定义它。将线程作为一个成员变量。

     线程内传入的是一个委托。(第二种重载 为无参无返回的委托,也就是说需要传一个无参无返回函数)

     完美运行:证明在Unity中我们是可以使用多线程的。

     我们在线程中写一个死循环来计时,让这个线程一直跑。

     运行:确实如我们所想一直在运行。

     我们关闭Unity运行:

     发现这个线程还在不停的运行!

     为什么?因为Unity是一个编辑器的存在,开的线程和Unity共生了。Unity本质上也是一个软件,只要软件没有关或者脚本没有改变,这个线程就会一直运行。

    因此,******Unity中的多线程 要记住关闭***********

     至于说为什么在Unity中新开的线程无法访问Unity相关对象:

    我们在新开线程中改变物体的position:

     运行:发现报错了。transform需要在主线程中去运行。

     因此,Unity虽然支持多线程,但是新线程无法访问Unity内容。

    我们甚至只是想在新线程中去打印Unity的内容都是不行的。不谈改变Unity,打印都不行!

     不能访问

    新开的线程虽然不能访问Unity,但是多线程可以进行一些复杂的逻辑计算:例如A*算法、网格计算,复杂的计算可能会卡住主线程,因此我们用副线程去计算。算好了,主线程去用。

    声明一个变量作为一个公共内存容器,一个线程放,一个线程取。

     在多线程中放入队列中。

     在Unity主线程中,去判断、获得队列中的内容。

     通过中间商来进行数据的交互,很重要。

    知识点二 协同程序是什么?

    协同程序简称协程       它是“假”的多线程,它不是多线程 他的本质是一个迭代器!

     知识点三 协同程序和线程的区别

     新线程是和主线程并行执行,就像两条平行线一样。

     协程和主线程则是,依附在主线程上。

     当一个函数被协程运行时,它可以分成n个部分。它不需要在一个主线程的流程中执行完毕。Unity的主线程也是一个无限循环的线程。协程执行函数的1部分,根据返回的内容决定是否继续向下执行。如果不执行,这个协程就会被挂起。分时分步,执行的时间和执行的步骤都是我们可以控制的。

    直到函数被执行完毕,协程结束。

    知识点四 协程的使用

     1、声明协程函数

    在MyCoroutine中,先输出i, 然后返回的条件为:要等待5秒钟,5秒之后再输出str

     2、开启协程函数(StartCoroutine())

     执行后没有反应:

     常用开启的方式:StartCoroutine

     第一种重载:直接写协程函数。

     第二种重载:直接传字符串(这种的不常用)

    第三种重载:字符串+参数(也不常用)

     最常用的方法:

     另一种常用方法:本质上是一样的。

     运行:协程开启

     再协程函数中,函数被yield return分成了几部分。一个协程函数可以有多个yield return。

     只要碰到 yield return 会根据条件来执行后面的程序。(例如:等5秒、等1秒)

    一个协程函数可以执行多次:

     3、关闭协程

    1、关闭所有协程


     2、关闭指定协程

     StartCoroutine返回的是Coroutine,是一个协程对象。我们可以将它存起来。

     运行:发现输出了三个1,两个123。三个协程都输出了1,当在等待5秒的过程中,c1被关闭了。只有c2,c3输出了123.

     协程中写一个死循环,一定条件下对主线程没有太大影响。

     知识点五 yield return 不同内容的含义

    1、下一帧执行:yield return 数字(null)

     无论数字是多少或者是null,都表示下一帧执行下面语句。

    在Update和LateUpdate之间执行。

     2、等待指定秒后执行:yield return new WaitForSeconds() 

     在start()函数中执行了MyCoroutine()输出了i。等待5秒后输出str,那么这个输出是什么时候执行呢?在Update和LateUpdate之间执行。

     3、等待下一个固定物理帧更新时执行:yield return new WaitForFixedUpdate()

     FixUpdate和碰撞检测相关函数之后执行。

    4、等待摄像机和GUI渲染完成后执行:yield return new WaitForEndOfFrame()

     在LateUpdate之后的渲染相关处理完毕后执行。

    5、异步加载相关的内容

    6、跳出协程

    yield break;

     yield return之后的语句不会执行。

     知识点六 协程受对象和组件失活销毁的影响

     

     

  • 相关阅读:
    【计算机组成原理】寄存器的本质——锁存器
    MySQL 几种导数据的方法与遇到的问题
    【云原生 一】 CRI、OCI、containerd和CRI-O、runc
    AI带你省钱旅游!精准预测民宿房源价格! ⛵
    【Linux语音控制 安卓设备刷短视频 orangePi zero2 H616 (已开源) 】.md uptada:23/11/07
    云南美食介绍 简单静态HTML网页作品 美食餐饮网站设计与实现 学生美食网站模板
    物联网、云计算、软件设计的前景都怎么样啊有没有业内懂哥
    项目经理之识别项目干系人
    Spring Bean 生命周期
    你还在凭感觉来优化性能?
  • 原文地址:https://blog.csdn.net/qq_42705793/article/details/127652498