协程1——Action机制
协程作为[color=rgb(85, 85, 85) !important]unity3d中非常重要的一个机制,我们有必要了解协程是如何运作的。下面我讲解一下协程的驱动原理:Action机制。 为什么叫Action机制?其实也可以叫Actor机制,至于原因,不用追究了,反正有了面向对象的概念就有了这哥们。
何为Action机制呢?传统编程中,每一个独立的功能块会封装成一个函数或者一个类对象等。但是我们经常会看到一个函数内部会连续调用多个函数,但这个仅能用于顺序执行的代码块儿;如果我们每个被调用的函数之间要等待一段时间怎么办呢?1、锁死线程——难道其他代码不工作了?2、启动其他线程——是可以,但增加了线程安全的维护。这时候我们想想,如果将每一个被调用函数封装成一个Action,然后用一个底层循环驱动Action的运转,到了Action可以执行的时候再去执行(甚至是重复执行、条件执行等),让后消亡,这样不是很好么。其实,这个就是Action机制。回想一下,所有的[color=rgb(85, 85, 85) !important]游戏引擎是不是都是靠Action机制驱动的呢?只不过底层循环不是一直循环而是每一帧等一下的循环。当然Unity3D的协程也是依靠这种循环驱动力运作的,只不过协程的Action是隐式的,即在编译后由编译器编译成了Action而已。
Action机制的两个主要部件:
interface IAction { bool isAlive { get; } void Update(); }
这个是Action必须实现的重要接口,isAlive表面是否有效,Update由驱动一直调用
public interface ITickObject { void Update(); }
这个是驱动循环必须实现的接口,每一帧去调用Update,Update函数内部调用所有的Action的Update进行更新,然后检测isAlive=false的Action,将其踢出循环队列。
|