协程之前,你需要了解线程的定义及用法!

协程之前,你需要了解线程的定义及用法!

unity 多线程_线程池_线程是什么意思

至于协程的概念,其实之前的文章中也提到过一些内容,但当时只是简单的提到了。 因此,很多人对协程的认识还很模糊。 那么本期我们就来全面的介绍一下,所以在了解协程之前,需要先了解一下线程,线程分为单线程和多线程。 我不会详细介绍线程的概念。 如果您有兴趣,可以上网查一下相关信息。

01

什么是协程

协程,也叫协程。 这是Unity3D中一个非常重要的概念。 Unity3D的开发过程中一般不考虑多线程。 为什么一般不考虑多线程? 因为在Unity开发中,对象的组件、方法、对象只能通过主线程来访问。 获取,如果没有这些组件和多线程,Unity的开发就会变得毫无意义。 我们在做主线任务的同时,还需要一些分支任务来协同工作,才能达到最终的效果。 解释得更形象一点unity 多线程,想象一下,当我们在主任务过程中需要一个消耗大量资源的操作时,如果在一帧中实现这样的操作的话,游戏就会变得非常卡顿。 这时候我们就可以利用协程来完成一定框架内工作的处理,而不影响主任务的进度。

02

协程原理

协程与线程不同。 协程的执行仍然在主线程中。 从原理上来说,它其实就是一个迭代器。 如果你对迭代器不了解unity 多线程,还是需要在线查看C#官方文档。 使用时需要使用关键字IEnumerator来定义迭代方法。 请注意,您使用的是 IEnumerator 而不是 IEnumerable。 两者很容易混淆。 在迭代器中,最关键的就是yield的使用,它是我们协程实现功能的主要方式。 通过这个关键方法,我们可以暂停协程的运行,记录下次启动的时间和位置等。

03

协程和线程的区别

对于协程来说,同一时间只能执行一个协程,而线程是并发的游戏图片,可以同时运行多个线程。

两者使用相同的内存,共享堆而不共享栈。

事实上,两者之间最关键和最简单的区别是,微观线程是并行的(对于多核CPU)技能特效,而协程是串行的。

04

协程的使用

首先通过迭代器定义一个返回值为IEnumerator的方法,然后在程序中通过StartCoroutine启动一个协程:

在正式开始代码之前,需要了解一下StartCoroutine的两个重载方法:

StartCoroutine(string methodName):这是不带参数的情况。 直接通过方法名(字符串形式)启动协程

StartCoroutine(IEnumerator例程):通过方法形式调用

StartCoroutine(string methodName, object value):通过方法名带参数调用

协程的打开方式主要有以上三种形式。 如果还是不明白,可以查看下面的代码:

//通过迭代器定义一个方法   IEnumerator Demo(int i)    {        //代码块
yield return 0; //代码块 }
    //在程序中调用协程 public void Test() { //第一种与第二种调用方式,通过方法名与参数调用 StartCoroutine("Demo", 1);
//第三种调用方式, 通过调用方法直接调用 StartCoroutine(Demo(1));    }

协程启动后,也会有两个方法来结束协程:StopCoroutine 和 StopAllCoroutines。 但需要注意的是,两者的使用需要遵循一定的规则。 在介绍规则之前,我们还要介绍一下StopCoroutine的重要性。 加载:

StopCoroutine(string methodName):按方法名(字符串)执行

StopCoroutine(IEnumerator例程):通过方法形式调用

StopCoroutine(Coroutineroutine):通过指定的协程关闭

刚才我们提到了它们的使用有一定的规则,那么有哪些规则呢? 答案是使用前两种方法来结束协程。 如果我们使用 StartCoroutine(string methodName) 来启动一个协程,那么要结束协程,就只能使用 StopCoroutine(string methodName) 和 StopCoroutine(Coroutineroutine) 来结束协程。

以上就是本期的全部内容。 下一期我们将对收益率进行分析。 下一期再见~

文章来源:http://mp.weixin.qq.com/s?src=11×tamp=1704183311&ver=4993&signature=J0XrmagcF3oOKptAd7O9xainHHmYlEjWJqgzF7t0qewwfrFvw7FO3qz3A2L83YKJKYlRFUVhWPY41jw4dYAQi9FVox6FYB*eKox4NloNY36CtBRzi*BQku5MSS*fUEnz&new=1