Skip to main content

数据模型 (Data Model)

数据模型 (Data Model)

数据模型(Data Model)是指在 FrooxEngine 中对类型(Types)、数据以及数据更改的声明、结构和处理机制。数据模型允许对 FrooxEngine 遇到的任何及所有类型进行更改检测、值同步、统一结构处理以及序列化。

元素 (Elements)

任何以某种方式受数据模型管理的事物都实现了 IWorldElement 接口。该接口赋予元素一系列属性,包括引用 ID(Reference ID)、可能的父级元素,以及该元素是否为持久化(Persistent)状态。由于所有实现此接口的类型都有一个引用 ID,因此每个元素本身都是一个引用类型(Reference Type)

该接口本身并没有太多行为——它仅仅指定了一个物体能够以某种方式被保存并加载到世界(Worlds)中。数据模型提供的更复杂的行为是由实现此接口的具体类型所提供的。直接实现此接口的三种元素类型分别是:同步元素(Sync Elements)工作器(Workers)世界(Worlds)

同步元素 (Sync Elements)

image.png


场景检查器(Scene Inspector)将 Slot 上组件内的每一个公共同步元素显示为白色小字。工作器检查器(Worker Inspectors)则显示构成特定工作器的内容,例如组件或同步对象。

同步元素(Sync Elements)代表一个可以被写入、被字段链接(Field Linkage),以及向其他元素发送或接收更改事件的值或对象。同步元素主要由字段(Fields)和各种类型的集合(Collections)组成——通常,任何以 Sync 开头的类型名称都派生自同步元素。

将同步元素与其他元素区分开来的主要特征就是“同步”。每当同步元素发生更改时(除了像 RawOutput<T> 极少数例外情况),它及其整个父级层级都会传播一个更改事件。这包括将元素放入世界的更新管理器(Update Manager)中,以便在更新循环(Update Loop)结束时同步它们的值。

链接机制 (Linkage)

主条目:链接机制(Linkage)

链接(Linkage)是一种将同步元素的排他控制权赋予单一来源(通常称为驱动器/Driver)的方法。存在两种类型的链接机制:链接(Links)驱动(Drives),而驱动器还可以选择一个可选的钩子(Hook)

  • 当一个字段被链接(Linked)时,它在检查器中会显示为青色(Cyan)。被链接的字段仍然会像普通字段一样发送数据模型事件,但只能由其驱动器进行更改。
  • 当一个字段被驱动(Driven)时,它在检查器中会显示为紫色(Purple)。被驱动的字段与被链接的字段行为相同,但被驱动字段的值不会通过网络进行同步。这允许实现针对每个用户的独立值,或者对那些进行网络同步代价过高的数据进行本地计算。

工作器 (Workers)

工作器(Workers)本质上是同步元素和其他工作器的容器,用于为引擎提供特定的、独立的任务。工作器的例子包括 插槽(Slots)组件(Components)、组件的子类,以及流(Streams)。工作器能够接收来自其子节点的事件,并将事件传播给其父节点。

工作器本身是一个本地构造(Local construct)。然而,它们通常存在于同步元素集合中,因此它们的存在状态通常会连同它们的元素一起在用户之间进行同步。

事件 (Events)

数据模型的一项重要功能是捕获元素或工作器的更改,并将这些更改传播给该元素的父级以及对该元素的引用中。存在于数据模型内部的所有事物都可以捕获并发送这些事件,而数据模型之外的事物通常则不能。

例如,ProtoFlux 中的 Changeable Source(可变源)节点能够从其引用的元素中接收更改事件。如果将一个 Slot(插槽)的可变源插入到 Get Slot Active(获取插槽激活状态)节点中,每当该 Slot 的激活状态(Active)发生改变时,它就能够更新所连接的监听器节点(Listener Node)。然而,Input(输入)节点并不会以同样的方式更新任何连接的监听器节点。这是因为前者接收来自数据模型的事件,而后者则不接收。每当 Slot 的 Active 字段(一个同步元素)发生更改时,它会将该更改传播给 Slot 本身(包含该 Active 字段的工作器),然后由可变源接收,并进而传递给监听器节点的整个上下文(Context)

世界 (World)

数据模型的核心是世界(World)。世界的更新循环(Update Loop)将数据模型中所有独立概念之间的通信和事件作为一个统一的流水线(Pipeline)来控制。这包括但不限于:

严格一致性 (Strict Exclusivity)

只有当房间(Session)中的每个人都对数据模型的内容达成共识时,数据模型才能毫无问题地运行。如果一个客户端向另一个客户端发送了接收方不存在的元素类型或工作器类型,接收方将不知道该如何处理这些信息,也不知道该如何同步潜在的元素值。这就是为什么被标记为核心(Core)程序集类型的插件(Plugins)会导致与没有安装该插件的玩家产生房间不兼容的原因。

延伸阅读 (Further Reading)