赞
踩
本文是作者在学习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会在唤醒条件满足的时候去重新唤醒协程,所以协程还是运行在主线程上。
资源加载指的是通过IO操作,将磁盘或服务器上的数据加载成内存中的对象。资源加载一般是一个比较耗时的操作,如果直接放在主线程中会导致游戏卡顿,通常会放到异步线程中去执行。
举个例子,当你需要从服务器上加载一个图片并显示给用户,你需要做两件事情:
其中,2操作必须等待1操作执行完毕后才能开始执行。
//伪代码
IEnumerator ShowImageFromUrl(string url)
{
Image image = null;
yield return LoadImageAsync(url, image); //异步加载图像,加载完成后唤醒协程
Show(image);
}
使用协程来进行异步加载在Unity中是一个很常用的写法。异步资源加载是一个较为深奥的话题,有兴趣的话可以通过下面两个参考链接进行研究:
Unity官方的异步加载场景的示例
倩女幽魂手游中的资源加载与更新方案
如果一个复杂的函数对于一帧的性能需求很大,我们就可以通过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) {
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。