在球形树上吠叫还是在别处寻找?

时间:2019-02-20 17:33:56

标签: data-structures tree logic

场景:必须以一种服务器可以有效地更新其他玩家以及任何其他玩家观察者动作和行为的方式来组织大量在3d空间中玩实时游戏的玩家。在仿真中,对象之间相互“交谈”的对象需要根据它们彼此之间的范围进行剔除;这是为了保持网络的健全性,程序员的健全性,并且还允许服务器let处理整个世界游戏空间的较小块。

但是,如果您有3000名玩家,就会遇到必须运行3000名玩家的问题!计算以找出所有内容之间的范围。 (Google告诉我,最后一个数字超过9000个数字;这太疯狂了,不值得在近实时环境中考虑。)

Daybreak Games 似乎通过大规模的在线第一人称射击游戏Planetside 2解决了这个问题;它允许3000名玩家在一个共享空间玩游戏并具有实时响应能力。他们显然是通过“领域树”数据结构完成的。

但是,我不是 positive 这是他们使用的解决方案,但我仍然在质疑如何应用“球体树”的概念来减少用于剔除的范围计算。合理的数量。

如果“球形树”不是适合树皮的正确树,那么我还应该将其他精力集中在解决这个问题上吗?

(我主要是c#程序员,但是我在寻找逻辑答案,而不是代码)

我发现的有关球状树的参考文献;

http://isg.cs.tcd.ie/spheretree/#algorithms

https://books.google.com/books?id=1-NfBElV97IC&pg=PA385&lpg=PA385#v=onepage&q&f=false

2 个答案:

答案 0 :(得分:0)

以下是我的一些想法: 让n代表玩家总数。

  1. 我认为您的估算值为3000!是错的。如果要计算给定固定距离矩阵的所有对对距离,请运行3000次,以O(n ^ 2 * t)的顺序选择2个操作,其中t是您花费在计算两个玩家之间距离上的操作数。如果您以边缘权重为欧几里得距离的方式建立玩家下标的图,则可以将其减少为全对最短路径问题,这可以通过O(n ^ 3)中的Floyd-Warshall算法来解决。

  2. 您所描述的内容听起来与进行范围查询非常相似:https://en.wikipedia.org/wiki/Range_searching。有很多可以帮助您的数据结构,例如范围树和k-d树。

答案 1 :(得分:0)

如果对象只需要与例如<= 100m远的对象进行交互,则可以将整个世界划分为100m x 100m的图块(或体素),并跟踪每个非空对象中的对象平铺。

然后,当一个对象需要“交谈”时,您只需要检查最多9个图块中的对象,看看它们是否足够接近即可听到。