-
Notifications
You must be signed in to change notification settings - Fork 4
关于globalData的使用问题
问: globalData设计的目的是什么?我只看到demo里面吧spaces放里面,就是保存一个space的管理器,demo里面并没有一个avatar的管理器,比如加好友之类的操作查找指定名字的avatar,就应该通过管理器来吧,我想把所有avatar放入globalData里面是否合适?
答: globalData从名字很容易理解, 是共享的数据,能够在所有的baseapps与cellapps进程之间同步数据。
什么内容该放什么不该放你需要自己分析, 如果你将所有的Avatar放到里面, 那么所有进程上都会存在所有Avatar的Mailbox,人数达到一定量, 内存消耗巨大。
一些标志类的东西放globalData比较好, 例如:全服消费打折, 经验翻倍等等,一些全局的管理器放里面也很不错便于访问,就像spaces(场景管理器)。
你要做好友公会之类的, 你可以思考一下spaces管理器, 你也实现一个这样的实体放到某个进程上进行管理就行了, globalData只需要方便的访问到这个管理器就行了。
玩家上线可以通知管理器更新状态,下线也是,以及其他各种行为。
答:
KBEngine.globalData["Spaces"] = base
如果Spaces在本进程中, 那么
python KBEngine.globalData["Spaces"]
返回的是Spaces Entity, 如果不在本进程中,
python KBEngine.globalData["Spaces"]
返回的是Spaces的mailbox. 这里有一个规则, 本进程中永远不可能出现本进程中实体的mailbox, 所有在本进程中能找到实体的mailbox都会被自动转化为实体。
你可以简单理解为mailbox就是实体的一个远程指针,在非当前进程只能使用这个远程的指针来访问到实体def方法。
KBE中, 这个操作会自动将实体的mailbox同步到共享data中。
mailbox在cellapp上是不稳定的, 随时可能迁移走, 其他进程中如果还保存了这个实体的cellmailbox很可能就是错的。 例子中, 这里存储的是basemailbox, base是不会被迁移走的, 可以理解为实体生命周期内是稳定的,而这个实体销毁时会将globalData中这个数据清除掉。