当前位置:   article > 正文

【Unity】Unity协程(Coroutine)的原理与应用_unity coroutine

unity coroutine


前言

本文是作者在学习Unity过程中对协程相关知识的汇总,以方便以后查阅。大部分内容转载自不同文章,原文链接可在最后一部分查看,如果对文章内容有任何困惑或者疑问,建议阅读原文相关部分。


一、什么是协程

首先看一下Unity官方对协程的定义:

A coroutine is like a function that has the ability to pause execution and return control to Unity but then to continue where it left off on the following frame.

Unity中的协程是一种返回值为IEnumerator的特殊函数,它可以主动的请求暂停自身并提交一个唤醒条件,Unity会在唤醒条件满足的时候去重新唤醒协程,所以协程还是运行在主线程上。

二、应用场景

1.异步加载资源

资源加载指的是通过IO操作,将磁盘或服务器上的数据加载成内存中的对象。资源加载一般是一个比较耗时的操作,如果直接放在主线程中会导致游戏卡顿,通常会放到异步线程中去执行。

举个例子,当你需要从服务器上加载一个图片并显示给用户,你需要做两件事情:

  1. 通过IO操作从服务器上加载图片数据到内存中。
  2. 当加载完成后,将图片显示在屏幕上。

其中,2操作必须等待1操作执行完毕后才能开始执行。

//伪代码
​
IEnumerator ShowImageFromUrl(string url)
{
   
    Image image = null;
    yield return LoadImageAsync(url, image); //异步加载图像,加载完成后唤醒协程
    Show(image);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

使用协程来进行异步加载在Unity中是一个很常用的写法。异步资源加载是一个较为深奥的话题,有兴趣的话可以通过下面两个参考链接进行研究:
Unity官方的异步加载场景的示例
倩女幽魂手游中的资源加载与更新方案

2.将一个复杂程序分帧执行

如果一个复杂的函数对于一帧的性能需求很大,我们就可以通过yield return null将步骤拆除,从而将性能压力分摊开来,最终获取一个流畅的过程,这就是一个简单的应用。

举一个案例,如果某一时刻需要使用Update读取一个列表,这样一般需要一个循环去遍历列表,这样每帧的代码执行量就比较大,就可以将这样的执行放置到协程中来处理:

public class Test : MonoBehaviour
{
   
    public List<int> nums = new List<int> {
    1, 2, 3, 4, 5, 6 };


    private void Update()
    {
   
        if(Input.GetKeyDown(KeyCode.Space))
        {
   
            StartCoroutine(PrintNum(nums));
        }
    }
	//通过协程分帧处理
    IEnumerator PrintNum(List<int> nums)
    {
   
        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/94472
推荐阅读
相关标签
  

闽ICP备14008679号