game_server.entity_domain
简介
基于权重分配的entity域管理器,处理游戏服务器中实体对象的域分配
-
通过entity_domain分配出来的域,关联着一个资源对象
-
相同的域共享资源对象所提供的资源:心跳对象、延迟处理对象等
-
域的分配策略: 优先获取权重值最小的资源对象所在的域
组件接口
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_owner | object | nil | 可选 | 域资源所有者 |
| ob | object | nil | 可选 | 域资源对象 |
| rid_weight_dict | map | nil | 可选 | 域资源的客户实体的权重表 key: 实体rid value: 权重值 |
| weight | int | 0 | 可选 | 总权重 |
成员方法
| 函数原型 | 函数作用 |
|---|---|
| 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);
}