- 最后登录
- 2019-12-2
- 注册时间
- 2012-8-25
- 阅读权限
- 90
- 积分
- 34660
- 纳金币
- 38268
- 精华
- 111
|
什么是协同程序(协程) 协同程序和线程差不多,也就是一条执行序列,拥有自己独立的栈,局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。
协程和线程的区别
一个具有多线程的程序可以同时运作几个线程,而协同程序却需要彼此协作地运行。
就是说,一个具有多个协同程序的程序再任何时刻只能与运作一个协同程序,并且运行的协同程序只会在其显示地挂起时,它的执行才会暂停。
协程的开启与终止
在[color=rgb(85, 85, 85) !important]unity3d中,使用StartCoroutine方法可开启一个协同程序,也就是说该方法必须在MonoBehaviour或继承于MonoBehaviour的类中调用。
StartCoroutine(string methodName) 可以开启线程并在线程结束前终止线程,并且开启线程是最多只能传递一个参数,性能消耗会更大一点。
StartCoroutine(IEnumerator routine) 只能等待线程的结束而不能随时终止(除非使用StopAllCoroutines()方法),在参数没有限制。
在Unity3D中,使用StopCoroutine(string methodName)来终止一个协同程序,使用StopAllCoroutines()来终止所有可以终止的协同程序,但这两个方法都只能终止该MonoBehaviour中的协同程序。
协程与yield语句
一个协同程序再执行过程中,可以在任意位置使用yield语句。yield的返回值控制何时恢复协同程序向下执行。
协同程序再对象自有帧执行过程中堪称优秀,在性能上没有更多的开销。
StartCoroutine函数是立即返回的,当时yield可以延迟结果,知道协同程序执行完毕。
Coroutine和Invoke比较
Invoke:执行没有被挂起,相当于设置完被调用函数的执行时间后即时向下执行。应用到每隔一段时间执行某个函数很方便。
Coroutine:新开一条执行序列(同新建线程差不多)并挂起,等待中断指令结束。开销不大,但需要挂起当前执行时使用。
|
|