关于传统AOI策略的一点改进口水

来源:互联网 发布:过期域名抢注平台 编辑:程序博客网 时间:2024/05/07 08:15

在传统意义上,AOI的策略大概会包含以下几两个构成要素(不是全部要素):

--构成AOI‘物理’空间基础的空间结构,具体来说可以常认为是地图管理,

  关于地图管理方面的一些小策略,之前的口水文里有点东西可看;

--广播方式,更准确说,是消息的传达方式,具体来说就是一个广播消息,

  如何确切到达它的目标对象;


而在下的一点口水,就重点在广播方式上。

先看看一个比较常用的具体方法:

bytearray b;

obj_list = get_from_map(x, y)

for obj in obj_list:

    send_to(obj.ip, b)  // socket send

各位看官应该很容易看出,for一下地socket send,大多数情况是造成IO开销峰值的元凶,

随着obj数量的递增,这段代码将会越来越灾难。


俺的想法是,把这个过程分离异步,首先,利用上面介绍的AOI包含的两个构成要素第一点:

area_list = get_area_from_map(x, y)

area_list可以认为是一个格子,或者是各位大侠手下更高级的地图管理方式实现下的一个地图单元,

那么,当一个obj要广播一个消息,可以这样处理:

bytearray b;

obj->boradcast_to_area(area_list, b)

    for area in area_list:

        area.set(obj.some_info(), b)

当中不做socket send,只是把要对某些地图单元广播的消息缓存在该单元内,如果没有需要接受消息的用于,

那么这个广播则可能永远不会有socket动作;

对于对这个消息感兴趣的用户,要获得这个消息:

bytearray b;

obj->interest_in_area(area_list)

    for area in area_list:

        push(area.all_broadcast_bytearray(), b)

    send_to(obj, b)

那么,对于感兴趣的用户来说,一次接受广播的动作,就是收集它感兴趣的区域内缓存的(有效的)广播消息,

打包给自己。


缺点:

  --内存开销可能不大友好,在下无法预计缓存广播消息对内存会产生多大压力(内存远没硬盘贱价;

  --消息传达的实时性,不好说咧,如果用来玩FIFA大概没戏了;

  --求各位看官补充喷;

好处:

  --还是那个,降低传统AOI广播方法带来的消耗,大概。

  --求各位看官补充顶。