Skip to content

多个baseApp实现聊天广播

ilvxna edited this page Aug 6, 2018 · 7 revisions

: 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设置这个标记, 将不会有玩家和其他地方创建的实体被创建到当前进程上了, 也就是说你可以在当前这个进程上专门处理特殊功能,不会影响到其他实体。

Clone this wiki locally