请教灯塔算法的问题,如果a在移动前看不到b,它就不会给b发出自己的移动消息;a在移动后已经在b的视线内,但b因为没有收到消息所以看不到a。这种不合理的情况怎么办呢?

如题,多谢!

标签: 开发求助
xiaoxiao 在 2015-1-6 11:04发布 分享到 weibo
1 回复
#1 {8} demon 2015-1-6 14:10 回复

这个是现在逻辑产生的bug,为了简化处理是会出现这种情况的,对应的处理方法如下:
1,简单的做法,现在实际上灯塔检测范围会比实际视野要大一圈(一般是大1/4到1/2个屏幕,这样会减少上面那种情况出现的概率),就是开始时不在视野范围内,最终到达的时候也不至于直接在视野中心出现。但是对于移动距离非常长或者两个物体相对运动的情况还是可能会有问题。
2,要从根本上解决,可以在场景的tick循环时扫描每个移动物体的状态,当有灯塔改变时触发相应事件,因为tick的时间较短(100ms以下),而物体移动速度是有上限的,因此不会偏差太多(最大偏差是speed×tick时间)。这种做法的缺点是会增加计算量,不过基于灯塔的算法本身计算十分简单应该不会有太大压力。LordofPomelo是因为开始已经用了1的做法,图省事才不用这种做法的。

xiaoxiao 2015-1-6 15:32 回复

理解不一定正确,请多指教。
1. 如果场景是如同lord让客户端一直通过推数据的方式,那么a移动中途到结束,不会再发起新的message,那么就可能即便是用1的做法,b也会永远看不到a了吧。
2. 增加一个场景的tick,是否类似actionmanager的tick时,通过行进间action的执行“嘀嗒嘀嗒”持续发起updateObject和updateWatcher,那么aoiEventManager就会自动发现变化,自动通知到更新呢。

这个论坛真不错,感谢。

xiaoxiao 2015-1-6 15:39 回复

你提示以后,我去检视了下move动作的action代码。

确实发现了,再move时除了onPathCheckout其实还在做updateObject和updateWatcher。

那么lord不会存在我们前面讨论的bug了?

xiaoxiao 2015-1-6 15:50 回复

理解的升华:

灯塔算法要避免纠缠入业务的逻辑。本质上灯塔关注的事各个物件静态位置与视距。运动等一切其它业务逻辑不应当让灯塔去感知和理解。所以1问题中物体运动发起、行进和停止这些业务态时,需要在合适的时间通知灯塔新的物件位置变化。

那么就不存在我反问的永远看不见的情况。因为更新位置是客户必须做的,但发出变化通知是灯塔必须做的。

demon 2015-1-6 15:55 回复

@xiaoxiao 哦 那应该不会了,估计是我后来加上或者别人帮我修了这个问题了

demon 2015-1-6 16:00 回复

@xiaoxiao 更新位置这个应该是服务端代码做的吧,客户端做这个会有安全隐患的。 不过位置变化,运动什么的确实不是灯塔应该关心的是,而是应该由每个移动的entity自己负责通知AOI服务,然后由灯塔自己决定是否来进行通知。

xiaoxiao 2015-1-6 16:01 回复

@demon 嗯,感谢。demon你是lord的作者吗。我要成为最懂lord 的人,多谢指导:)

demon 2015-1-6 16:08 回复

@xiaoxiao 里面服务端的代码主要是我写的,lord里面还是有不少bug的,不过后来的同事帮我改了不少

xiaoxiao 2015-1-6 16:10 回复

@demon 想表达的客户是指的灯塔服务的客户,不是客户端

回到顶部