-
Notifications
You must be signed in to change notification settings - Fork 4
多个baseApp实现聊天广播
问: 1. 多个baseApp中,如何获得指定baseApp?
2. 我可不可以在创建baseApp群的时候划分baseApp功能组?
例如:把没有cell实体的base放到某组baseApp下,把非玩家但有cell实体的放到某组baseApp下,把玩家放到某组baseApp下, 这样循环玩家组baseApp的entities就等于做广播了
3.
求教:一组实体服务器,开n个服。 跨服聊天和单服聊天,该怎么做~
想法:每个服都有一个chat的base实体,分布在不同的baseApp上。 这个chat实体记录在globalData里(这样好找哪个服的chat?),chat实体记录着当前服务器在线玩家(玩家登陆时调用chat的加入方法,玩家离开时调用chat的离开方法),跨服聊天就遍历所有chat的所有玩家,单服聊天则找出某个服的chat。
4.有没有更好的办法~
答:
关于第一个问题:
D:\kbe\kbengine\assets\scripts\base\kbengine.py : onBaseAppReady中
os.getenv("KBE_BOOTIDX_GROUP")
os.getenv("KBE_BOOTIDX_GLOBAL")
进程启动后会设置一些环境变量,其中
KBE_BOOTIDX_GROUP
代表进程组启动的顺序, 例如你一组服有5个baseapp, 5个baseapp被称为baseapp进程组, 它们根据启动的先后顺序赋予
KBE_BOOTIDX_GROUP
指定的值。
KBE_BOOTIDX_GLOBAL
代表在整个服务组中启动的顺序, 例如: dbmgr第一个启动那么它是1, cellapp第8个启动那么它是8.
你可以考虑在baseapp中封装一个代表进程的实体, 将其根据
KBE_BOOTIDX_GLOBAL
编号注册到globalData,
KBEngine.globalData[os.getenv("KBE_BOOTIDX_GROUP")] = appEntity
在合适的时候你需要获得指定baseapp做事情就可以
KBEngine.globalData[第一个baseapp].doFunc(xxx)
关于第二个问题:
其实也可以参考我回答的第一个问题 根据进程启动顺序在:
onBaseAppReady
时决定在本进程中创建出哪些实体, 例如:将所有的管理器都在第一个进程中创建, 所有的space放在第二个进程上。 但你无法阻止玩家被分配到某个进程上,虽然扩展一下很容易做到,但不太推荐过于关注底层性能手动干预平衡,这和引擎定位的使用复杂度有关系, 如果你觉得性能不够可以增加进程和机器来解决。
关于第三个问题:
你说的这种模式很适合引擎架构
第四个问题:
看谁还有更好的办法。
最新版支持对app设置标记,
KBEngine.setAppFlags
, 具体参见API文档。 其中有一个标记是app不参与负载均衡, 那么你可以选择某个baseapp设置这个标记, 将不会有玩家和其他地方创建的实体被创建到当前进程上了, 也就是说你可以在当前这个进程上专门处理特殊功能,不会影响到其他实体。