Unity协程与线程

本文概述了Unity中协程与线程的区别和应用场景。协程在同一时间仅执行一个,共享主线程,适合资源有限的场景;线程则能异步运行,多线程能提高效率,但需注意并发问题。Unity协程通过StartCoroutine开启,常用yield关键字控制执行流程。线程包括委托线程、Thread类实现和线程池,适用于多任务并行执行。
摘要由CSDN通过智能技术生成

协程与线程总结:

这篇文章属于自己整理,有很多理解不透彻的地方。以后有了更深的理解再做修改。一入代码深似海,越学越不会。

协程与线程在功能上较为类似。

协程:同一时间只能执行一个协程,所有的协程共享一个线程资源,并且会被执行在游戏的主线程上,因为所有的协程是不在同一时间执行的所以添加协程的开销不大。

线程:线程是异步运行的,在多处理器中一个线程可以同时与其他线程同时工作。开辟多线程开销较大。但多线程能够更有效的利用计算机资源,在性能上线程要优于协程。

线程常见问题:同一时间多个线程共同访问方法可能导致方法重复。(比如,多个线程访问一个加载场景的方法,在第一个线程访问场景加载方法未完成时另一个线程也可访问,此时就导致两次加载场景出现逻辑问题,此时就需要用到线程锁来解决)。

Unity函数执行图

当协程被激活,它会一直到下一个yield语句执行,然后会暂停知道恢复时继续执行。

协程的实现

协程的开启方式StartCoroutine()

这个方法有三个重载,

StartCoroutine(IEnumerator routine)枚举器参数

StartCoroutine(strng methodName,[DefaultValue(“null”)]object value) 方法名,传入参数

StartCoroutine(string methodName) 方法名

常见的协程写法案例:

 

  [ContextMenu("Run")]

    private void main()

    {

        StartCoroutine("ILoadScence");

}

  IEnumerator ILoadScence()

  {

        Debug.Log("第一阶段");

 

        AsyncOperation async = SceneManager.LoadSceneAsync(1);

 

        Debug.Log("第二阶段");

 

        while (!async.isDone)

        {

            Debug.Log("第三阶段");

            Debug.Log(async.progress);

            yield return null;

            Debug.Log("第四阶段");

        }

        Debug.Log("第五阶段");

}

 

其实也可以这样写

 [ContextMenu("Run")]

    private void main()

    {

        StartCoroutine("ILoadScence");

    }

    IEnumerator ILoadScence()

    {

        List<int> list = new List<int>();

    ...

        return list.GetEnumerator();

}

但确实没见人这样用过。主要有些类似上面加载场景的功能这种方法很不适用,因为根本无法获取加载进度。

这里要提一点。协程是由StartCoroutine打开的,所调用的方法并不是协程,出学的时候只知道协程怎么写便一直误以为下面的方法就是协程。

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值