IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity3D 协程 -> 正文阅读

[游戏开发]Unity3D 协程

简介

什么是协程?
????????unity协程是一个能够暂停协程执行,暂停后立即返回主函数,执行主函数剩余的部分,直到中断指令完成后,从中断指令的下一行继续执行协程剩余的函数。函数体全部执行完成,协程结束。由于中断指令的出现,使得可以将一个函数分割到多个帧里去执行。

协程和线程的区别?
????????线程是利用多核达到真正的并行计算,缺点是会有大量的锁、切换、等待的问题,而协程是非抢占式,需要用户自己释放使用权来切换到其他协程, 因此同一时间其实只有一个协程拥有运行权, 相当于单线程的能力。

  • 协程是 C# 线程的替代品, 是 Unity 不使用线程的解决方案。
  • 使用协程不用考虑同步和锁的问题。
  • 多个协程可以同时运行,它们会根据各自的启动顺序来更新。

性能:
????????在性能上相比于一般函数没有更多的开销。

协程的好处:
????????让原来要使用异步 + 回调方式写的非人类代码, 可以用看似同步的方式写出来。能够分步做一个比较耗时的事情,如果需要大量的计算,将计算放到一个随时间进行的协程来处理,能分散计算压力
协程的坏处:
????????协程本质是迭代器,且是基于unity生命周期的,大量开启协程会引起gc。如果同时激活的协程较多,就可能会出现多个高开销的协程挤在同一帧执行导致的卡帧。


使用

开启协程

// 形式一 
StartCoroutine(CustomCorutine()); 
StartCoroutine(CustomCorutine("haha"));//向方法中传递参数 

// 形式二 
StartCoroutine(“CustomCorutine”); 
StartCoroutine(“CustomCorutine”, "haha");//向方法中传递参数
void Awake()
{
    StartCoroutine(Corutine_WaitForFixedUpdate());
}

void FixedUpdate()
{
    Debug.Log("FixedUpdate" );
}

IEnumerator Corutine_WaitForFixedUpdate()
{
    yield return new WaitForFixedUpdate();
    Debug.Log(string .Format("====>{0}    time:{1}", 1, Time .time));
    yield return new WaitForFixedUpdate();
    Debug.Log(string .Format("====>{0}    time:{1}", 2, Time .time));
}

?

协程中的等待函数


yield null:协程将在下一帧所有脚本的Update执行之后,再继续执行. 
yield WaitForSeconds:协程在延迟指定时间,且当前帧所有脚本的 Update全都执行结束后才继续执行. 
yield WaitForFixedUpdate:协程在所有脚本的FixedUpdate执行之后,再继续执行. 
yield WWW:协程在WWW下载资源完成后,再继续执行. 
yield StartCoroutine:协程在指定协程执行结束后,再继续执行. 
WaitForSecondsRealtime:与WaitForSeconds类似,但不受时间缩放影响. 
WaitWhile:当返回条件为假时才执行后续步骤.

停止协程

????????在开发中可能会开启多个协程,如果你想停止其中某个协程,你可使用StopCoroutine,但在使用时,停止协程的方式要与开启协程的方法一致。.StopCoroutine(“CustomCorutine”)必须与StartCoroutine(“CustomCorutine”)成对使用,与StartCoroutine(CustomCorutine())一起使用则完全无效。

IEnumerator cor;
void Awake()
{
    // 注意保存IEnumerator变量.
    cor = Corutine_WaitForFixedUpdate();
    StartCoroutine(cor);
    StartCoroutine(Corutine_Stop());
}
IEnumerator Corutine_WaitForFixedUpdate()
{
    Debug.Log(string .Format("A : {0}", 0));
    yield return new WaitForEndOfFrame();
    Debug.Log(string .Format("A : {0}", 1));
}
IEnumerator Corutine_Stop()
{
    yield return new WaitForFixedUpdate();
    // 通过cor停止协程
    // 而不是this.StopCoroutine(Corutine_WaitForFixedUpdate());
    this.StopCoroutine(cor);
}

????????如果想停止多个协程,可使用StopAllCoroutines方法,但这种方法只能停止当前MonoBehaviour类实例中所有协程,其他不受影响。如果想停止gameObject上所有脚本组件中的协程,禁用脚本组件是无法停止协程的,只需要禁用gameObject即可。


其他问题

协程书写时的性能优化:
????????常见的问题是直接new 一个中断指令,带来不必要的 GC 负担,可以复用一个全局的中断指令对象,优化掉开销;在 Yielders.cs 这个文件里,已经集中地创建了上面这些类型的静态对象
这个链接分析了一下https://blog.csdn.net/liujunjie612/article/details/70623943

协程是在什么地方执行?
????????协程不是线程,不是异步执行;协程和monobehaviour的update函数一样也是在主线程中执行。unity在每一帧都会处理对象上的协程,也就是说,协程跟update一样都是unity每帧会去处理的函数。经过测试,协程至少是每帧的lateUpdate后运行的。

????????详细信息请看官方文档:Unity - Manual: Order of execution for event functions

同一时刻同一脚本实例中能有多少个运行的协程?
????????在一个MonoBehaviour提供的主线程里只能有一个处于运行状态的协程。因为协程不是线程,不是并行的。同一时刻、一个脚本实例中可以有多个暂停的协程,但只有一个运行着的协程。

协程的注意点:

  • IEnumerator 类型的方法不能带 ref 或者 out 型的参数,但可以带被传递的引用。
  • 在函数 Update 和 FixedUpdate 中不能使用 yield 语句,否则会报错, 但是可以启动协程。
  • 在一个协程中,StartCoroutine()和 yield return StartCoroutine()是不一样的。

????????前者仅仅是开始一个新的Coroutine,这个新的Coroutine和现有Coroutine并行执行。
后者是返回一个新的Coroutine,是一个中断指令,当这个新的Coroutine执行完毕后,才继承执行现有Coroutine。

参考博客:https://zhuanlan.zhihu.com/p/59619632

????????????????? https://www.cnblogs.com/crazytomato/p/8178382.html

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-09-30 12:15:25  更:2021-09-30 12:17:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 2:34:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码