协程与线程总结:
这篇文章属于自己整理,有很多理解不透彻的地方。以后有了更深的理解再做修改。一入代码深似海,越学越不会。
协程与线程在功能上较为类似。
协程:同一时间只能执行一个协程,所有的协程共享一个线程资源,并且会被执行在游戏的主线程上,因为所有的协程是不在同一时间执行的所以添加协程的开销不大。
线程:线程是异步运行的,在多处理器中一个线程可以同时与其他线程同时工作。开辟多线程开销较大。但多线程能够更有效的利用计算机资源,在性能上线程要优于协程。
线程常见问题:同一时间多个线程共同访问方法可能导致方法重复。(比如,多个线程访问一个加载场景的方法,在第一个线程访问场景加载方法未完成时另一个线程也可访问,此时就导致两次加载场景出现逻辑问题,此时就需要用到线程锁来解决)。
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打开的,所调用的方法并不是协程,出学的时候只知道协程怎么写便一直误以为下面的方法就是协程。
<