aoi 九宫格 灯塔 区别

缘缘的问题:

有个我一直没想明白的问题,就是假如按照九宫格来作为玩家的视野范围的话,那在玩家人数填满视野,而且屏幕显示的区域大于了玩家的视野区域的话,玩家看到的现象不就是自己处在一个九宫格的中央吗?和玩家在游戏里面,认为视野应该是一个圆形不一样哦,而且实际上表现出来的还真就是一个圆形的感觉,这是怎么做到的呢。

例如我玩的坦克世界,他的视野就是一个圆,出了这个圈,我就看不到对方了对方围着我绕圈圈,我都能看到,但是有个特点就是,我看不到的对方,也能打到他,而且正常触发所有逻辑,除了我看不到

 

十字链表不适用的地方

来自缘缘的回答:

嗯,十字链表这个适用的游戏场景是假设对象经常静止或小幅移动,对于大幅移动和进出场景是小概率事件。相反情形,适合的算法就是九宫格,但是这种做法的一个小小缺点是客户端会收到一些屏幕外的对象消息,有点浪费带宽吧,如果我们把发消息做成批量加压缩的方式,这种浪费并不大。灯塔算法的特点是什么呢?

 

灯塔不适用的地方

我举了一个很不恰当的例子:

(比如玩解谜游戏,你到了一个房间,房间的灯被点亮,那个房间的视野你就可以看到,出了房间,灯熄灭,你看不到房间内的东西)

 

来自缘缘的回答:

唔,灯塔这个思路,感觉是引入了一个部落管理者的概念,而这个部落的管理范围,就是灯台的管理范围,这个范围可以根据实际情况进行自定义,就不是像九宫格一样固定死的管理范围,例如甚至因为主城玩家多,所以一个主城区域给一个灯塔,主城就有很多个灯塔,野外人少,一个灯塔就管一大块地图区域。这个管理者起到的作用,就是根据玩家目前能涉及到的区域,能直接找到每个管理者要到所有的关联对象,而不需要遍历大地图的所有玩家。但是有个缺点,就是当你的视野范围能触及到多个灯塔的时候,那么你需要处理的数据还是相当庞大的。所以灯塔比较适合的游戏场景,应该是玩家只能处于和看到单个灯塔的管理范围内,而不能涉及到多个灯塔的管理范围,例如你举例的房间解密游戏,玩家的可视范围和操作范围同时只有一个房间。但是aoi主要面对的是多人在线网游,房间解密游戏没有体现出多人的"多"来,因为一般房间游戏,人数都是有限的,而且不会太多,所以多人在线网游跑图的那种,还是九宫格和十字链表的设计更常用,灯塔存在太明显的缺陷了

 

来自参考链接1:

(细分:还可以分为“九宫格法”和“灯塔法”。“九宫格法”——每个区域中记录的是处在本区域的实体。“灯塔法”——每个区域中记录的是会观察到我的实体。“灯塔法”可以看做是“九宫格法”的进一步优化。)

 

 

波波的问题:

忽然想起 十字链越过大量聚集的点是不是只有遍历所有的聚集数据(例如大量玩家集中在x:2到x:3之间,一个实体从x:1移动到x:3)

来自缘缘的回答:

是啊,两种设计都不是为了避免这种玩家大量聚集的数据情况而设计的,这种大量玩家聚集在一个点上,要想优化,只能做分线处理,或者做格子人数上限的限制

 

总结精辟!专业!

 

 

相关讨论参考连接:

  1. http://www.mamicode.com/info-detail-2691887.html
  2. https://www.lmlphp.com/user/6329/article/item/343230/3
  3. https://zhuanlan.zhihu.com/p/201588990?utm_source=wechat_timeline
  4. https://www.cnblogs.com/silvermagic/p/9373414.html
  5. https://blog.codingnow.com/2012/03/dev_note_13.html
  6. https://blog.codingnow.com/2008/11/aoi_server.html
  7. https://blog.codingnow.com/2008/07/aoi.html
Unity中实现AOI(Area of Interest,兴趣区域)九宫格算法的方法如下: 首先,创建一个AOIManager类,用于管理和维护AOI区域和对象。该类需要包含以下几个关键组成部分: 1. AOI格子的定义:定义一个格子的大小,并将整个场景划分为多个格子。可以使用二维数组来表示格子,每个元素存储在该格子中的对象列表。 2. 对象的定义:定义一个对象的结构,包括对象的唯一标识ID和对象的位置信息。 3. 对象的管理:AOIManager类需要负责管理所有对象的位置和状态。当一个对象进入或离开一个格子时,需要更新该对象在AOIManager中的位置信息。 4. AOI九宫格算法的实现:在AOIManager中实现九宫格算法,根据一个对象的位置信息,计算出该对象所在的格子以及该对象周围的格子。 5. 状态更新:当一个对象的位置发生变化时,需要通过九宫格算法计算该对象应该进入或离开的格子,并更新该对象的位置信息。 6. 感知范围:根据九宫格算法计算出的周围格子,可以获取到该对象周围的其他对象。可以根据需要定义对象的感知范围,只获取特定范围内的对象。 总结一下,Unity实现AOI九宫格算法需要创建AOIManager类,实现格子划分和对象管理,以及实现九宫格算法来计算对象所在的格子和对象的感知范围。这种方法可以提高游戏中大量对象的更新效率,减少不必要的计算和通信开销,提升游戏性能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值