Unity 协程的原理

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

内容简介:协程不是多线程,协程还是在主线程里面(注:在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 之后的代码(可以用过上面的小例子看出)。这样我们就可以每帧加载一个直到加载完毕,不会出现卡顿的现象。


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

查看所有标签

猜你喜欢:

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

计算机系统基础

计算机系统基础

袁春风 / 机械工业出版社 / 2014-7-1 / CNY 49.00

《计算机类专业系统能力培养系列教材:计算机系统基础》主要介绍与计算机系统相关的核心概念,解释这些概念如何相互关联并最终影响程序执行的结果和性能。共分8章,主要内容包括数据的表示和运算、程序的转换及机器级表示、程序的链接、程序的执行、存储器层次结构、虚拟存储器、异常控制流和I/O操作的实现等。内容详尽,反映现实,概念清楚,通俗易懂,实例丰富,并提供大量典型习题供读者练习。本书可以作为计算机专业本科或......一起来看看 《计算机系统基础》 这本书的介绍吧!

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

HTML 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具