2020-11-18【设计模式】行为型模式&解耦型模式

2020-11-18  本文已影响0人  持刀的要迟到了

行为型模式 (游戏编程模式p139)

本篇的模式,可帮助快速定义并提炼大量高质量且可维护的行为。
类型对象让我无需定义实际的类,就可以创建各种类型的行为。
子类沙盒提供了一系列安全的基础功能函数,可以通过组合这些函数定义各种行为。
最高级的选择是字节码,可以将行为从代码,完全转移到数据中去。

总结:
类型对象,就是很简单的给对象一个枚举值的type。(或者是一个唯一的序列化文件,如ScriptableObject,或者一行数据表的ID,里面除了type,还有其他类型相关信息,如描述,所属父类型,等...)
子类沙盒,就是很简单的接口继承。接口本身并无功能实现。
字节码:啊,是Lua,虚拟机。那没事了。

字节码

我们要让它易于修改,易于重新加载,并且在物理上与游戏的可执行文件相分离。
这种形式更像是一种“数据”。我们可以在单独的数据文件中定义行为,游戏引擎以某种方式加载并“执行”它,那么上述问题就得到解决。

大概就是自己做了一下动态运算符,“解释”静态的数据含义 。比如,写一个加法类,来解释“+”字符串。
问题:太慢了,而且占用大量内存。

当我们的游戏运行时,计算机并不会去遍历c++语法结构树,而是执行我们在编译期编译成的“机器码”。为什么需要机器码呢?

我们不去加载执行真正的“机器码”,而去定义自己的虚拟机器码。我们再游戏中实现一个执行它们的模拟器。这些虚拟机器码和机器码相似(高密度、线性、相对底层),同时它完全受到游戏本身的安全管理。
我们称这个小型模拟器为虚拟机(VM_VirtualMachine)。这个虚拟机所执行的语义上的“二进制机器码”称为字节码。它具备在数据内定义对象的灵活性和易用性,同时也比解释器模式这种高级呈现方式更高效。

如果功能清单不是太复杂的话,这个方案将非常可行。即使最终没用上,至少也能对Lua及其他基于该原理的语言有更好的理解。

PS:JIT_Just In Time编译器,可以很快的把语言翻译成机器码。而机器码就是上面说的那个牛逼玩意儿。

指令集定义了一套可以执行的底层操作。一系列指令被 编码为字节序列。虚拟机逐条执行指令栈上的这些指令。通过指令组合,即可完成很多高级行为。

想一下Lua。再见。bye~ bye~
就是语法解释器。对于一个程序员来说,绕了一圈又一圈。这玩意儿写出来给别人用的。

子类沙盒

"使用基类提供的操作集合来定义子类中的行为"

class SuperActorBase
class Hero1 : SuperActorBase

如果此时我们编写这个基类,会发生什么?

解耦型模式 (游戏编程模式p194)

组件模式

unity的gameobject就是遵循组件模式。
gameobject是一个空的对象,但是你可以往上面 AddComponent。
各个组件之间没有直接的联系,又各有各自的功能。
自定义组件:继承自MonoBehaviour

组件之间的消息传递:

上一篇 下一篇

猜你喜欢

热点阅读