首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

unity update 协程_Unity 协程的原理

Unity 协程的原理 发布时间:2019-06-13 18:45, 协程不是多线程,协程还是在主线程里面(注:在Unity中非主线程是不可以访问Unity资源的) 1、线程、进程和协程的区别 进程有自己独立的堆和栈...,即不共享堆也不共享栈,进程由操作系统调度 线程拥有自己独立的栈和共享的堆,共享堆不共享栈,线程亦有操作系统调度(标准线程是这样的) 协程和线程一样共享堆不共享栈,协程由程序员在协程的代码里面显示调度...协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失了标准线程使用多CPU的能力。...2、Unity中协程执行的原理 先贴上一张unity主线的框架运行图: 在Unity运行时,调用协程就是开启了一个IEnumerator(迭代器),协程开始执行,在执行到yield return之前和其他的正常的程序没有差别...Unity生命周期对协程的影响: 通过设置MonoBehaviour脚本的enabled对协程是没有影响的,但如果gameObject.SetActive(false) 则已经启动的协程则完全停止了,即使在

99310

Unity 协程

2 .同一个协程函数可以被多次调用。 细心的同学可能会有问,如果上例中的函数别重载,使用方法名的方式调用会不会有问题呢?如果你知道结果给你点个赞。我们测试一下。 没错,发现了什么?...使用方法名的带参数的调用居然使用没参数的重载方法(unity版本2018.4,使用方法名方式调用协程,不会识别重载,只会调用编译时第一个名称符合的方法),而使用方法体的方法却可以区分开重载。...由于协程的调用依赖于Mono脚本,在实际开发中我们可以进行其进行一个封装, 停止方式 public void StopAllCoroutines(); public void StopCoroutine...predicate执行时机为首次执行为调用时机(比如在Start中开启的协程,则本帧在Start时执行,本帧的Update后则不再执行),之后执行时机为Update之后,LateUpdate之前。...实际开发中使用建议 开发中,并不是所有的脚本都继承自mono,相反实际项目中大部分都不会继承自mono,所以我们可以单独拿出来一个继承自Mono的单例类,专门用于开启协程。

72220
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Unity 协程系统

    在使用Unity协程时经常遇到以下让人头疼的问题: 1.协程没办法在不继承自MonoBehaviour的类中开启或调用,例如不需要挂载为Unity组件的类,无法开启协程;因为协程原本就是MonoBehaviour...类中的方法 2.有时已经开启了某协程A,但协程A还没执行完,这时又要重复开启它自己时,每次都要判断协程A是否还在运行,根据情况考虑是否重新开启抑或终止开启新协程,让人心累 为了更为方便的调教协程,解决以上问题...,决定对协程单独封装一下,游戏中的所有协程统一进行管理: 1 using UnityEngine; 2 using System.Collections.Generic; 3 using System.Collections...8 yield return new WaitForSeconds(delay); 9 callback.Invoke(); 10 } 这样一来,即使外部类不继承...MonoBehaviour也可以很方便的使用协程,循环创建协程时也方便提前中断还未执行的协程。

    81010

    unity协程简介

    当我们调用一个方法想要让一个物体缓慢消失时,除了在Update中执行相关操作外,Unity还提供了更加便利的方法,这便是协程。...中的协程方法通过yield这个特殊的属性可以在任何位置、任意时刻暂停。...值得注意的是,协程并不会在Unity中开辟新的线程来执行,其执行仍然发生在主线程中。当我们有较为耗时的操作时,可以将该操作分散到几帧或者几秒内完成,而不用在一帧内等这个操作完成后再执行其他操作。...如:yield return new WaitWhile(() => frame < 10); 当某一个脚本中的协程在执行过程中,如果我们将该脚本的enable设置为false,协程不会停止。...Unity在调用StartCoroutine()后不会等待协程中的内容返回,会立即执行后续代码。 虽然协程十分方便和灵活,但不当的使用会使程序产生无法预想的后果,请使用前慎重考虑。

    86220

    Unity协程认知

    协程使用之前请注意以下几点: 1.协程只需要调用一次,只需要调用一次,只需要调用一次 !...2.yield return表示挂起,挂起的意思是协程里的变量会被保留,直到达到return的条件才会执行return以下的代码片段。...举个例子: yield return new WaitForSeconds(0.9f);//执行到这儿,等待0.9s,继续执行这句代码以下的代码片段 3.开启协程的方式: a.StartCorountine...("协程函数名"); b.StartCorountine(协程函数名(协程形参));//可以传多个参数 4.协程只需调用一次,但可以控制内部执行次数: a.一次:不需要判断语句 举个例子: IEnumerator...: 协程是在主线程(Main Thread)执行的过程中开启的一段逻辑处理,和主线程共用一份资源,挂起的时候不会阻塞主线程,但要注意的是同一时刻只运行一个协程;多线程则不能共享主线程里的资源,需要关心同步以及锁的问题

    33010

    Unity之协程

    老早就对Unity这个功能产生了强烈的好奇,今天就要把这块骨头给啃了。 目前我对协程的理解相当于有点像线程,但它实际上不是线程。...话不多说先来个代码给个初印象: 一、开启协程: 我在Unity下创建了一个Cube(随便什么物体都行),然后把我的cs文件挂载上去。..."); } } 当然了,如果在程序中开始的协程是字符串形式,那么结束也应该是字符串形式: 有些注意事项: 1.多个协程可以同时运行,它们会根据各自的启动顺序来更新...2.协程不是线程,它们运行在同一线程中,跟普通的脚本一样。...3.目前Unity中没有简便的方法来检测作用于对象的协程数量以及具体是哪些协程作用在对象上。 emm,好像没什么要说的了。后续有什么想法再补充。

    55340

    协程及Python中的协程

    1 协程 1.1协程的概念 协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程。...我们把一个线程中的一个个函数叫做子程序,那么子程序在执行过程中可以中断去执行别的子程序;别的子程序也可以中断回来继续执行之前的子程序,这就是协程。...1.2 协程的优缺点 协程的优点:   (1)无需线程上下文切换的开销,协程避免了无意义的调度,由此可以提高性能(但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力)...(2)进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序 2 Python中如何实现协程 2.1 yield实现协程   前文所述“子程序(函数)在执行过程中可以中断去执行别的子程序;别的子程序也可以中断回来继续执行之前的子程序...2.2 greenlet实现协程   Python的 greenlet就相当于手动切换,去执行别的子程序,在“别的子程序”中又主动切换回来。。。 greenlet协程例子: 1 #!

    1.3K20

    Unity2D开发入门-协程

    前言 在Unity中,协程(Coroutine)是一种特殊的函数,可以在程序的执行过程中暂停和恢复执行。 协程通常用于处理时间相关的任务,例如延迟执行、动画序列等。...启动协程 要在Unity中使用协程,可以按照以下步骤进行操作: 创建一个带有返回类型为IEnumerator的函数,并将其标记为协程。...例如,在Start函数中启动协程: void Start() { StartCoroutine(MyCoroutine()); } 暂停协程 在协程中使用yield语句来控制执行流程。...在协程中可以使用循环、条件语句等控制流程,实现复杂的逻辑。 注意事项: 协程只能在MonoBehaviour的派生类中使用。 协程可以被中断和停止。...可以使用StopCoroutine方法停止指定的协程,或者使用StopAllCoroutines方法停止当前对象上的所有协程。

    29240

    java协程框架quasar和kotlin中的协程

    这得益于Go语言级别的协程的处理效率。协程不同于线程,线程是操作系统级别的资源,创建线程,调度线程,销毁线程都是重量级别的操作。...接下来要分享的这个开源项目,正是解决了在java中只能使用多线程模型开发高并发应用的窘境,使得java也能像Go语言那样使用协程的语义开发了。...而反观协程,基于固定的几个线程调度,可以轻松实现百万级的协程处理,而且内存稳稳的。 后记 最后,博主以为Quasar只是一个框架层面的东西,所以就又去看了下同样是jvm语言的kotlin的协程。...java中的多线程操作。...io操作,io操作是阻塞的,协程的并发也就变成了调度协程的几个线程的并发了。

    54430

    GoLang协程与通道---中

    GoLang协程与通道---中 协程的同步:关闭通道-测试阻塞的通道 使用 select 切换协程 通道、超时和计时器(Ticker) 习惯用法:简单超时模式 协程和恢复(recover) ---- 协程的同步...---- 阻塞和生产者-消费者模式: 在通道迭代器中,两个协程经常是一个阻塞另外一个。如果程序工作在多核心的机器上,大部分时间只用到了一个处理器。可以通过使用带缓冲(缓冲空间大于 0)的通道来改善。...可以在 select 中通过 time.After() 发送的超时信号来停止协程的执行。...---- 协程和恢复(recover) 一个用到 recover 的程序停掉了服务器内部一个失败的协程而不影响其他协程的工作。...举例,safelyDo() 中 defer 修饰的函数可能在调用 recover 之前就调用了一个 logging 函数,panicking 状态不会影响 logging 代码的运行。

    82710

    Golang中的协程(goroutine)

    一个进程可以创建多个线程,同一个进程中的多个线程可以并发执行,一个程序要运行的话至少有一个进程。...并行可以显著提高程序的性能,特别是在多核 CPU 中,能够利用多个 CPU 核心进行计算。...Go 语言中的协程是由 Go 运行时调度器(scheduler)进行管理和调度的。当程序启动时,Go 运行时会默认启动一个主协程,主协程会创建其他的子协程,这些协程会被分配到不同的系统线程上进行执行。...当某个协程发生阻塞时,Go 运行时会将该协程挂起并让出 CPU,转而执行其他协程,以充分利用系统资源。 在 Go 语言中,创建协程非常简单,只需要在函数调用前加上 go 关键字即可。...} 多协程和多线程         Golang中每个goroutine(协程)默认占用内存比Java、C的线程少。

    66840

    为什么 Java 坚持多线程不选择协程?

    先说结论:协程是非常值得学习的概念,它是多任务编程的未来。但是Java全力推进这个事情的动力并不大。 先返回到问题的本源。当我们希望引入协程,我们想解决什么问题。...你可以理解为NIO + woker thread大致就是一套“协程”,只不过没有实现在语法层面,写起来不优雅而已。问题是,你的场景真的处理了并发几十万,上百万的连接吗? 再说创建/销毁线程的开销。...你会发现即便你用vert.x或者kotlin的协程,归根到底也是要靠线程池工作的。...可以说,Java这个生态里尽管没有“协程”这个第一级别的概念,但是要解决问题的工具并不缺。 Java仅仅是没有解决”协程“在Java中的定义,以及“写得优雅“这个问题。...如果协程底层用的还是线程池,两个协程还是通过共享内存通讯,那么多线程该出什么bug,多协程照样出。

    1.8K20

    协程中的“协”字是什么意思?

    Golang中的协程(coroutine)概念,其名字来源可以从两个方面来解释,一是历史背景,二是技术特性。 历史背景 协程(coroutine)这个概念最早可以追溯到计算机科学的早期。...在Golang中,协程被实现为“goroutine”,它是Go语言并发设计的核心。Goroutine在使用和概念上与传统的协程有所不同,但基本思想是相通的。...这意味着一个运行中的协程会一直执行,直到它显式地表示要让出执行权(例如,通过等待I/O操作、显式挂起或调用其他协程等方式)。...这种方式的优点是上下文切换开销小,因为切换发生的时机是可预测的,并且由协程自己控制。但缺点是,如果一个协程长时间占用CPU不主动让出执行权,会导致其他协程饿死,影响程序的响应性。...因此,“协”在协程中确实可以理解为强调了协作式的调度方式,这是区别于传统线程抢占式调度的一个重要特点。

    10500

    揭秘kotlin协程中的CoroutineContext

    前言 -- 从kotlin1.1开始,协程就被添加到kotlin中作为实验性功能,直到kotlin1.3,协程在kotlin中的api已经基本稳定下来了,现在kotlin已经发布到了1.4,为协程添加了更多的功能并进一步完善了它...就像提到线程,很多人会把它和进程进行比较,线程和进程分别是操作系统中的CPU调度单位和资源划分单位,它们在操作系统中有专门的数据结构代表,而协程在操作系统中没有专门的数据结构代表,所以协程并不是由操作系统创建和调度...] 当一个协程创建后它就处于新建(New)状态,当调用Job的start/join方法后协程就处于活跃(Active)状态,这是运行状态,协程运行出错或者调用Job的cancel方法都会将当前协程置为取消中...的一个子接口)的complete方法都会让当前协程进入完成中(Completing)状态, 处于完成中状态的协程会等所有子协程都完成后才进入完成(Completed)状态。...当父协程的子协程同时抛出多个异常时,CoroutineExceptionHandler只会捕获第一个协程抛出的异常,后续协程抛出的异常被保存在第一个异常的suppressed数组中,如下: fun main

    1.9K31

    Java 中的协程库 - Quasar

    这就是协程适用的场景。...协程,其实就是在一个线程中,有一个总调度器,对于多个任务,同时只有一个任务在执行,但是一旦该任务进入阻塞状态,就将该任务设置为挂起,运行其他任务,在运行完或者挂起其他任务的时候,再检查待运行或者挂起的任务的状态...协程的方式更多用来做阻塞密集型(比如 I/O)的操作,计算密集型的还是使用线程更加合理。 Java 官方并没有协程库。但是伟大的社区提供了一个优秀的库,它就是 Quasar。...那么我们为什么称 Quasar 为协程库呢?...这里 Quasar 就是通过抛异常(SuspendExecution)的方式来达到的,这样就完成了以线程的方式实现协程。

    2.8K31
    领券