跳到主要内容

game_server.entity_domain

简介

基于权重分配的entity域管理器,处理游戏服务器中实体对象的域分配

  1. 通过entity_domain分配出来的域,关联着一个资源对象

  2. 相同的域共享资源对象所提供的资源:心跳对象、延迟处理对象等

  3. 域的分配策略: 优先获取权重值最小的资源对象所在的域

组件接口

DomainAsset.gs

域资源对象

拥有一组独立的资源:一般是心跳对象、计时器对象等。

函数原型函数作用
object heart()获取心跳对象
object delay()获取计时器对象

DomainAssetPool.gs

域资源对象池

管理一组域资源对象(DomainAsset实例)

函数原型函数作用
void setup(map asset_pool_cfg)域资源对象池初始化
object find_asset_ob(domain d)通过域实例寻找域资源对象
object exclusive_allocate(string rid)为指定实体rid分配一的独占的域资源对象
object allocate(string rid, int allocatee_weight = 1)为指定实体rid分配一个域资源对象
void release(string rid)实体对象释放持有的域资源
void add_asset(Asset asset)添加一个域资源
void remove_asset(Asset asset)移除一个域资源
bool has_enough_empty_assets()判断是否有足够数量的全空域资源对象
void set_rid_asset(string rid, Asset asset)设置实体RID和域资源的映射关系
void delete_rid_asset(string rid)删除实体RID和域资源的映射关系
object find_asset_ob_by_rid(string rid)根据实体RID找到域资源对象

entity_domain.gs

函数原型函数作用
bool setup(map para = nil)本模块的初始化函数
domain create_entity_domain(mixed class_id, string entity_rid = nil)通过实体的class id和rid申请一个域
void release_entity_domain(mixed entity_ob_or_rid)客户实体归还域
domain exclusive_allocate_domain(string rid)客户实体以独占模式分配一个域
domain allocate_domain(string rid, int weight = 1)客户实体以普通模式(权重)分配一个域
void release_domain(string rid)客户实体归还域
object find_asset_ob(domain d)查找域对应的域资源对象
object find_asset_ob_by_rid(string rid)根据客户实体rid查找对应的域资源对象
void dump_all()调试接口: 输出所有资源池信息

FEntityDomainAsset.gs

域资源的客户实体组件

实体对象做为域资源的客户时,需要包含本组件

函数原型函数作用
object get_asset_ob()获取域资源对象
object get_delay()获取域资源对象的计时器对象

Asset

域资源

成员变量

变量名类型初始值须初始化描述
asset_ownerobjectnil可选域资源所有者
obobjectnil可选域资源对象
rid_weight_dictmapnil可选域资源的客户实体的权重表
key: 实体rid
value: 权重值
weightint0可选总权重

成员方法

函数原型函数作用
void drop()销毁自身
void bind_owner(object asset_owner)和域资源所有者建立绑定关系
void unbind_owner()解除和域资源所有者的绑定关系
object get_asset_ob()获取域资源对象
domain get_asset_domain()获取域资源对应的域
int get_weight()获取当前已分配的权重值
bool is_empty_asset()判断是不是空的域资源(没有分配给任何客户实体)
void add_weight_rid(string rid, int weight)增加域资源对应的客户实体的权重值
void remove_weight_rid(string rid)移除域资源对应的客户实体的权重值
void dump()调试接口: 输出客户实体的权重信息

样例

public void test()
{
cfg.init_by_map({
"server_id" : 1,
"disable_mongo" : true
});
engine.boot();

map para = {
"asset_pool" : {
"initial_asset_count" : 1
}
};

entity_domain.setup(para);

string rid = RidD.new_rid("T");
domain d = entity_domain.create_entity_domain(1, rid);
test_equal(d != nil, true);

string rid2 = RidD.new_rid("X");
domain d2 = entity_domain.allocate_domain(rid2, 10);
test_equal(d2 != nil, true);

test_equal(d == d2, true);

string rid3 = RidD.new_rid("E");
domain d3 = entity_domain.exclusive_allocate_domain(rid3);
test_equal(d3 != nil, true);

test_equal(d != d3, true);
}