kbengine属性同步分析

实体的属性是定义在def文件中

属性会有几个不同的flag来表示属性是如何更新的

 

entitydef/common.h

  • ALL_CLIENT 属性能被周围的客户端获得,包括自身。相当于同时设置了OWN_CLIENT和OTHER_CLIENT标志。
  • ALL_CLIENTS 同ALL_CLIENT
  • BASE 只能在Base上使用
  • BASE_AND_CLIENT 属性在base和客户端都可见,相当于同时设置了OWN_CLIENT和BASE标志。
  • CELL_PRIVATE entity的内部属性。 只在cell的entity内部可见,相当于私有属性。
  • CELL_PUBLIC 可以被服务端的其它entity访问。在kbe中,现在暂时和CELL_PUBLIC是一样的。
  • CELL_PUBLIC_AND_OWN 在cell上的其它entity可见,对客户端来说,仅自身客户端可见

 

在entity类中会有宏定义 ENTITY_HEADER

 

这里将其展开,主要是看其中的onScriptSetAttribute()函数。如果脚本层修改了属性值,会回调onScriptSetAttribute()。(object.__setattr__)

 

在815行,会调用onDefDataChanged()

 

 

679 到 682行 将属性值放到memorystream中去,然后发送

会根据propertyDescription里的flag(看三个if中的判断条件),即def文件中作用域的描述,形成发包,广播到关心这个数据的app里面。

其中同步客户端时会通过socket发送这个数据包到baseapp baseapp中转到客户端, 客户端根据def描述解析并最终更新到对应实体数据中。

我们看其中广播给其他客户端的

在751行的宏定义展开之后

下面是forwardMessageToClientFromCellapp()的发送片段,会将信息发送给客户端

 

 

同时注意到baseapp的entity中也有onDefDataChanged()函数

128行的判断会将不具有ED_FLAG_BASE_AND_CLIENT 的属性数据类型才会发送到客户端。这些属性数据的定义如下

 

baseapp的属性改变只会发给自己的客户端,而不会广播

cellapp有广播的可能