游戏逻辑思想
上QQ阅读APP看书,第一时间看更新

12. 主动与被动

我们本小结讨论一下主动与被动的设计。先举个例子来描述什么是主动,什么是被动。

我们需要设计一个引导系统,当出现某个窗口的时候,引导系统将作出一些反应。那么这边我们有2种方式实现这个需求:

1. 当有个窗口打开的时候,通知机制层向外面发送一个窗口打开事件,引导系统监听这个事件并作出响应,这是被动模式。

2. 引导事件定时去查询监听的窗口的状态,如果发现了窗口的状态是需要的状态,那么就作出响应,这是主动模式。

那么我们比较一下主动和被动的一些优缺点:

主动模式因为需要轮询状态,与被动方式相比,没有那么的及时。很多情况下,这种轮询都没有触发事件。如果轮训的状态需要通过一定的计算,那么这种方式是很浪费CPU资源的。

被动模式的事件发生的地方是在触发的那一刻,事件的触发和响应是连在一起的,这给调试带来了极大的便利,可以很容易的找到为什么没有触发对应的行为。而主动模式的响应是滞后的,意味着它的响应实际上比目标事件发生的时间晚。具体晚多少取决于主动轮询的频繁程度。

主动模式有利于实现多条件类型的监控,比如它可以监视多个状态的改变。而被动模式虽然也可以监听多个条件,但是在条件的变更中,被动模式很不灵活。被动模式监听的通常是触发这样的行为,而当一个状态没有发生变更的时候它就显得比较乏力。

举个例子:引导系统需要在窗口A关闭的时候,且窗口B打开的时候触发一个行为。

对于主动模式而言,它只需要轮询窗口A和窗口B的状态即可。而对于被动模式,它可以监听窗口B的打开事件。但是窗口A从头到尾都没有任何状态的变更,监听的也不是窗口A的关闭,这时候就比较尴尬了。

在主动模式的间隔内,可能会遗漏掉变更。比如主动模式是1秒判断一次,那么如果玩家在1秒内完成了打开窗口到关闭窗口这样的操作。主动模式可能就没有办法正常的触发了相关的行为了。当然,这个问题可以有不少解决方案。比如修改判断间隔,或者忽略这个情况,因为这个情况事实上也不会造成什么体验的问题,只是在逻辑上存在这样的一种情况。

这2种模式各有有缺点,通常在设计之初,会使用被动模式,方便调试。当后面被动模式无法支撑条件的时候,或者条件存在与或取反等结合的时候,我们需要加入主动模式。一个系统如果是设计成主动被动可自由切换或者可以一起使用的话,这将是最理想的。

这边我们还需要再更深的讨论下这2种模式。我们说主动模式在某些情况下其实是有一定效率优势的,当事件触发了多次时,主动模式只会在后面去取状态进行判断,而被动模式会多次响应执行。另外,很重要的一点,主动模式没有立即响应,也就避免了死循环以及重入。举个例子,在一个以被动模式为基础设计的关卡系统里面,在它的某个关卡的条件里面,策划配置了怪物数量小于0触发通关。怪物死亡的逻辑是死亡,触发事件,从管理器移除。 当最后一只怪物死亡的时候(怪物数量变更)触发了关卡通关,关卡通关清理场景怪物又导致了怪物的死亡,于是出现了死循环。我们需要有经验的被动模式设计者才能提前做好准备,比如在怪物死亡的时候先判断一下是否已死。如果是主动模式的话,那么怪物死亡的时候不会触发任何东西,在下次轮询的时候,关卡获取到当前的怪物数量触发通关清理怪物。这时候之前的怪物已经正常从管理器里面移除了,也就不会被多次销毁。