在传统意义上,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广播方法带来的消耗,大概。