Unity 协程的原理

栏目: 编程语言 · 发布时间: 4年前

内容简介:协程不是多线程,协程还是在主线程里面(注:在Unity中非主线程是不可以访问Unity资源的)进程有自己独立的堆和栈,即不共享堆也不共享栈,进程由操作系统调度线程拥有自己独立的栈和共享的堆,共享堆不共享栈,线程亦有操作系统调度(标准线程是这样的)

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

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

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

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

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

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

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

2、Unity中协程执行的原理

先贴上一张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 之后的代码(可以用过上面的小例子看出)。这样我们就可以每帧加载一个直到加载完毕,不会出现卡顿的现象。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Coding the Matrix

Coding the Matrix

Philip N. Klein / Newtonian Press / 2013-7-26 / $35.00

An engaging introduction to vectors and matrices and the algorithms that operate on them, intended for the student who knows how to program. Mathematical concepts and computational problems are motiva......一起来看看 《Coding the Matrix》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具