Unity里的协程和lua里的协同

线程:一个线程在程序中和其他线程是异步运行的,在多处理器机器中一个线程可以同时与所有其他线程的实时运行其代码,这使得线程编程能够解决很复杂的事情,因为可能在相同的时间里一个线程在改变它而另一个线程正在读取它,正因为如此,你必须通过锁,以确保这种情况不会由任何确保没有共享内存发生.Unity中可以开启多线程, 但是只有主线程能访问Unity的方法。

协程(coroutine)与多线程情况下的线程比较类似:有自己的堆栈,自己的局部变量,但与其它协同程序共享全局变量等很多信息, 但 协同程序绝对不是一个线程。这意味着在同一时间只有一个协同程序在执行,而其他协程处于休眠状态,他们会根据各自的启动顺序来更新,它会被执行在游戏的主线程上,所以实际上在同一时间游戏的核心只有一个协同程序在运行同一时间只能执行某个协程。开辟多个协程开销不大。协程适合对某任务进行分时处理。

线程和协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时运行多个线程;而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只在必要时才会被挂起。开始一个协程时,执行从被调用方法的起始处开始,然后,接下来的每次协程调时,从协程返回(yield return)的位置接着执行。

unity协程实现主要组成:继承于MonoBehaviour的类中调用,开启线程时最多只能传递一个参数,IEnumerator接口 提供迭代,IEnumerator不能有ref参数和out参数,yield return xxx 指定下一次迭代入口, waitForFixedUpdate在FixedUpdate后执行,适用于物理控制。null, 0, wartforseconds在每帧Update后执行,适合于分多帧完成一个 任务。waitForEndofFrame 在每帧末尾执行操作,如相机控制。www 在请求结束后执行,适合于网络下载数据。StartCoroutine 开启协程。StopCoroution(“协程方法名字”),此方法只能停止以StartCoroutine开启的协程。StopAllCoroutine()停止本对象中开启的所有协程。还有一种方法可以终止协同程序,即将协同程序所在gameobject的active属性设置为false,再次设置active为ture时,协同程序并不会再开启,但是当禁用协程所在的脚本时并不能终止协程。当协程遇到yield return 一个方法时,要等到这个方法运行完成才执行,下面的逻辑。

StartCoroutine可以用一个字符串形式的方法名字来开启一个协程。也可以用同样的方法关闭一个协程,只有用这种方法开启的协程可以传递一个object类型的参数,也可以用IEnumerator 对象做参数开启协程和关闭协程,此时只需要定义一个返回类型为IEnumerator的方法,然后开启这个方法即可,但 该方法要有yield return 关键字,这是因为带有yield指令的IEnumerator的函数,最终会被编译成一个实现了IEnumerator接口的类,这是C#自带的功能 ,而IEnumerator 的MoveNext方法被每帧调用来判断是否完成,完成后自动调用Reset方法, 但是自定义实现IEnumerator类需要手动调用reset方法。StartCoroutine方法返回一个Coroutine对象,也可以用这个对象关闭协程。

public class myIEmator : IEnumerator 
{
    private int num = 0;

    // 对应协程运行时,当前上下文的对象。
    // 比如指令 yield return object; 返回的值。
    public object Current { get { return null; } }

    // 判定协程是否运行结束
    public bool MoveNext()
    {
        if (++this.num < 20)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public void Reset()
    {
        this.num = 0;
    }

一、 lua协程函数概览

方法 描述
coroutine.create() 创建coroutine,返回coroutine, 参数是一个函数,当和resume配合使用的时候就唤醒函数调用
coroutine.resume() 重启coroutine,和create配合使用
coroutine.yield() 挂起coroutine,将coroutine设置为挂起状态,这个和resume配合使用能有很多有用的效果
coroutine.status() 查看coroutine的状态.注:coroutine的状态有四种:dead,suspend,running,normal
coroutine.wrap() 创建coroutine,返回一个函数,一旦你调用这个函数,就进入coroutine,和create功能重复
coroutine.running() 返回正在跑的coroutine,一个coroutine就是一个线程,当使用running的时候,就是返回一个corouting的线程号
发布了29 篇原创文章 · 获赞 13 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_39407066/article/details/85013105