您好,欢迎来到品趣旅游知识分享网。
搜索
您的当前位置:首页unity协程理解

unity协程理解

来源:品趣旅游知识分享网
unity协程理解

什么是协程?

unity协程是⼀个能够暂停协程执⾏,暂停后⽴即返回主函数,执⾏主函数剩余的部分,直到中断指令完成后,从中断指令的下⼀⾏继续执⾏协程剩余的函数。函数体全部执⾏完成,协程结束。

由于中断指令的出现,使得可以将⼀个函数分割到多个帧⾥去执⾏。协程的好处:

让原来要使⽤异步 + 回调⽅式写的⾮⼈类代码, 可以⽤看似同步的⽅式写出来。

能够分步做⼀个⽐较耗时的事情,如果需要⼤量的计算,将计算放到⼀个随时间进⾏的协程来处理,能分散计算压⼒协程的坏处:

协程本质是迭代器,且是基于unity⽣命周期的,⼤量开启协程会引起gc

如果同时激活的协程较多,就可能会出现多个⾼开销的协程挤在同⼀帧执⾏导致的卡帧协程书写时的性能优化:

常见的问题是直接new ⼀个中断指令,带来不必要的 GC 负担,可以复⽤⼀个全局的中断指令对象,优化掉开销。协程是在什么地⽅执⾏?

协程是通过迭代器来实现功能的,在迭代器中,最关键的是yield 的使⽤,这是实现协程功能的主要途径,通过该关键⽅法,可以使得协程的运⾏暂停、记录下⼀次启动的时间与位置。

yield 也是脚本⽣命周期的⼀些执⾏⽅法,不同的yield 的⽅法处于⽣命周期的不同位置:yield return null; 暂停协程等待下⼀帧继续执⾏yield return 0或其他数字; 暂停协程等待下⼀帧继续执⾏

yield return new WairForSeconds(时间); 等待规定时间后继续执⾏yield return StartCoroutine(\"协程⽅法名\");开启⼀个协程(嵌套协程)yield return GameObject; 当游戏对象被获取到之后执⾏

yield return new WaitForFixedUpdate():等到下⼀个固定帧数更新

yield return new WaitForEndOfFrame():等到所有相机画⾯被渲染完毕后更新yield break; 跳出协程对应⽅法,其后⾯的代码不会被执⾏

yield return new WaitUntil(...)根据定义挂起语句, 直到指定的条件返回 trueyield return new WaitWhile(...)根据定义挂起语句, 直到指定的条件返回 false协程怎么开始?

⾸先通过⼀个迭代器定义⼀个返回值为IEnumerator的⽅法,然后再程序中通过StartCoroutine来开启⼀个协程即可:在正式开始代码之前,需要了解StartCoroutine的两种重载⽅式:

StartCoroutine(string methodName):这种是没有参数的情况,直接通过⽅法名(字符串形式)来开启协程StartCoroutine(IEnumerator routine):通过⽅法形式调⽤,⽅法可以带参数

StartCoroutine(string methodName,object values):带参数的通过⽅法名(字符串形式)+参数(参数类型⽽不是字符串)进⾏调⽤协程怎么结束?

StopCoroutine(string methodName):通过⽅法名(字符串)来进⾏

注意事项:如果使⽤StartCoroutine(string methodName)来开启⼀个协程的,那么结束协程就只能使⽤StopCoroutine(stringmethodName)和StopCoroutine(Coroutine routine)来结束协程StopCoroutine(IEnumerator routine):通过⽅法形式来调⽤StopCoroutine(Coroutine routine):通过指定的协程来关闭

StopAllCoroutines暂停的是当前脚本下的所有协程

gameObject.active = false 可以停⽌该对象上全部协程的执⾏,即使再次激活,也不能继续执⾏。但注意MonoBehaviour enabled = false 不能停⽌协程;对⽐ update却是可以在MonoBehaviour enabled = false 就中⽌

原因:由于协程在StartCoroutine时被注册到的GameObject上,他的⽣命期受限于GameObject的⽣命期,因此受GameObject是否active的影响。

结论:协程虽然是在MonoBehvaviour启动的(StartCoroutine)但是协程函数的地位完全是跟MonoBehaviour是⼀个层次的,不受MonoBehaviour的状态影响。协程结束的标志是什么?

如果最后⼀个 yield return 的 IEnumerator 已经迭代到最后⼀个是,MoveNext 就会 返回 false 。这时,Unity就会将这个 IEnumerator 从cortoutines list 中移除。

只有当这个对象的 MoveNext() 返回 false 时,即该 IEnumertator 的 Current 已经迭代到最后⼀个元素了,才会执⾏ yield return 后⾯的语句。

协程的使⽤场景例⼦:将⼀个复杂程序分帧执⾏;制作计时器;

异步加载等功能,⽐如:AB包资源的异步加载Reaources资源的异步加载场景的异步加载WWW模块的异步请求线程、进程、协程的区别:

进程拥有⾃⼰独⽴的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。

线程拥有⾃⼰独⽴的栈和共享的堆,只共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。协程和线程⼀样只共享堆,不共享栈,协程由程序员在协程的代码⾥显⽰调度。

⼀个应⽤程序⼀般对应⼀个进程,⼀个进程⼀般有⼀个主线程,还有若⼲个辅助线程,线程之间是并⾏的,在线程⾥⾯可以开启协程,协程是串⾏的,⼀个脚本中可以有多个协程,但同⼀时刻只有⼀个协程在运⾏。

协程和线程的区别是:协程避免了⽆意义的调度,由此可以提⾼性能,但也因此,程序员必须⾃⼰承担调度的责任,同时,协程也失去了标准线程使⽤多CPU的能⼒。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- pqdy.cn 版权所有 赣ICP备2024042791号-6

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务