Unity协程与线程

协程与线程总结:

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

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

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

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

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

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 list = new List();

    ...

        return list.GetEnumerator();

}

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

这里要提一点。协程是由St


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部