unity update 协程_Unity 协程的原理

unity update 协程_Unity 协程的原理Unity协程的原理发布时间:2019-06-1318:45,浏览次数:1118,标签:Unity协程不是多线程,协程还是在主线程里面(注:在Unity中非主线程是不可以访问Unity资源的)1、线程、进程和协程的区别进程有自己独立的堆和栈,即不共享堆也不共享栈,进程由操作系统调度线程拥有自己独立的栈和共享的堆,共享堆不共享栈,线程亦有操作系统调度(标准线程是这样的)协程和线程一样共享堆不共…

大家好,又见面了,我是你们的朋友全栈君。

Unity 协程的原理

发布时间:2019-06-13 18:45,

浏览次数:1118

, 标签:

Unity

协程不是多线程,协程还是在主线程里面(注:在Unity中非主线程是不可以访问Unity资源的)

1、线程、进程和协程的区别

进程有自己独立的堆和栈,即不共享堆也不共享栈,进程由操作系统调度

线程拥有自己独立的栈和共享的堆,共享堆不共享栈,线程亦有操作系统调度(标准线程是这样的)

协程和线程一样共享堆不共享栈,协程由程序员在协程的代码里面显示调度

一个应用程序一般对应一个进程,一个进程一般有一个主线程,还有若干个辅助线程,线程之间是平行的,在线程里面可以开启协程,让程序在特定的时间内运行。

协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失了标准线程使用多CPU的能力。

2、Unity中协程执行的原理

先贴上一张unity主线的框架运行图:

在Unity运行时,调用协程就是开启了一个IEnumerator(迭代器),协程开始执行,在执行到yield

return之前和其他的正常的程序没有差别,但是当遇到yield

return之后会立刻返回,并将该函数暂时挂起。在下一帧遇到FixedUpdate或者Update之后判断yield return

后边的条件是否满足,如果满足向下执行。

根据unity主线的框架运行图我们知道,协同程序主要是在update()方法之后,lateUpdate()方法之前调用。

Unity生命周期对协程的影响:

通过设置MonoBehaviour脚本的enabled对协程是没有影响的,但如果gameObject.SetActive(false)

则已经启动的协程则完全停止了,即使在Inspector把gameObject

激活还是没有继续执行。也就说协程虽然是在MonoBehvaviour启动的(StartCoroutine)但是协程函数的地位完全是跟MonoBehaviour是一个层次的,不受MonoBehaviour的状态影响,但跟MonoBehaviour脚本一样受gameObject

控制,也应该是和MonoBehaviour脚本一样每帧“轮询” yield 的条件是否满足。

注:WaitForSends()受Time.timeScale影响,当Time.timeScale = 0f时,yieldreturn new

WaitForSecond(X)将不会满足。

3、协程的主要应用

协程不是只能做一些简单的延迟,如果只是单纯的暂停几秒然后在执行就完全没有必要开启一个线程。

协程的真正作用是分步做一些比较耗时的事情,比如加载游戏里的资源

using System.Collections; using System.Collections.Generic; using

System.Threading; using UnityEngine; public class Test : MonoBehaviour {

private int num = 0; void Start() { StartCoroutine(Test1()); } IEnumerator

Test1() { while (num < 30) { num++; Debug.Log(num); yield return null;

Debug.Log(“————-” + num); } } void Update() { Debug.Log(“update” +

num); } void LateUpdate() { Debug.Log(“lateUpdate!” + num); } }

上面的例子很简单就是加载30个对象,如果一次性加载会有卡顿现象,影响游戏体验。这是我们就可以使用协程了,协程是每帧LateUpdate之前执行yield

return 之前的代码,LateUpdate之后执行yield return

之后的代码(可以用过上面的小例子看出)。这样我们就可以每帧加载一个直到加载完毕,不会出现卡顿的现象。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149432.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 计算机服务怎么打开flash,快速讲解Win10自带的浏览器如何开启Adobe Flash?

    计算机服务怎么打开flash,快速讲解Win10自带的浏览器如何开启Adobe Flash?电脑现已成为我们工作、生活和娱乐必不可少的工具了,在使用电脑的过程中,可能会遇到Win10自带的浏览器如何开启AdobeFlash?的问题,如果我们遇到了Win10自带的浏览器如何开启AdobeFlash?的情况,该怎么处理怎么才能解决Win10自带的浏览器如何开启AdobeFlash?带来的困扰呢,对于这样的问题其实我们只需要Win10专业版MicrosoftEdge42.17134…

    2022年4月30日
    192
  • servlet和jsp的区别_获取servletcontext

    servlet和jsp的区别_获取servletcontext关于serveletContext.getRealPath()方法1.关于request.getRealPath问题:Stringfilename=request.getRealPath(filename)——————-信息:warning:[deprecation]getRealPath(java.lang.String)in

    2026年1月23日
    3
  • Navicat 15 激活补丁破解方法

    Navicat 15 激活补丁破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    133
  • Idea激活码最新教程2017.3.7版本,永久有效激活码,亲测可用,记得收藏

    Idea激活码最新教程2017.3.7版本,永久有效激活码,亲测可用,记得收藏Idea 激活码教程永久有效 2017 3 7 激活码教程 Windows 版永久激活 持续更新 Idea 激活码 2017 3 7 成功激活

    2025年5月24日
    4
  • python读取图片名称_照片文件名怎么改jpg

    python读取图片名称_照片文件名怎么改jpgPython读取文件夹下的.jpg图片,提取图片的文件名。最近做的图像处理,需要读取文件夹下所有图片和对应的文件名,进行相关处理,最后保存的图片要求文件的名称与原图名称一致。百度找了好多例子也没找到,最后零零碎碎的搜索,通过一些个人的思考把相关的知识点和程序结合,总算做出来了。举个简单的功能:读取文件夹下的图片和对应的图片名,先处理成灰度图像,再进行保存,要求保存的图片的名称与原图名称一致。效果如下:读取F:\image下的000~004.jpg,最后处理的灰度图片保存在F:\image\sa

    2025年9月1日
    6
  • java环境变量怎么配置_java环境变量设置怎么配置

    java环境变量怎么配置_java环境变量设置怎么配置展开全部1.先下载jdk安装程序,搜62616964757a686964616fe58685e5aeb931333365656636索【jdk】,进入jdk下载官网。虽然在其他网站也可以下载,但个人经验来说,去官网下载安全最有保障,这里我推荐去官网下载。2.进入官网,找到下载按钮,如图标记,点击按钮进入下载选择页面。3.进入选择下载页面之后,如图选择接受安装协议,然后针对个人pc的操作系统选择相应…

    2022年7月7日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号