【问题标题】:Bark at a Sphere Tree or Look Somewhere Else?在球形树上吠叫还是去别处看?
【发布时间】:2019-02-20 17:33:55
【问题描述】:

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

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

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

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

如果球形树不是适合吠叫的树,我还应该注意什么来解决这个问题?

(我是一名 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

【问题讨论】:

    标签: data-structures tree logic


    【解决方案1】:

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

    1. 我想你估计3000!是错的。如果要在给定固定距离矩阵的情况下计算所有对的距离,则运行 3000 次选择 2 次操作,顺序为 O(n^2*t),其中 t 是计算两个玩家之间距离所花费的操作数。如果您在边权重为欧几里得距离的玩家基础上构建图,您可以将其简化为全对最短路径问题,这可以通过 Floyd-Warshall 算法在 O(n^3) 中实现。

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

    【讨论】:

    • 谢谢,我会调查这些,你的权利,我可能把问题弄得一团糟,所以谢谢你涉水过
    • @Marky 如果您觉得它有帮助,您可以点赞或将其标记为已接受吗?谢谢。
    【解决方案2】:

    如果对象只需要与距离

    然后,当一个物体需要“说话”时,你只需要检查最多 9 个图块中的物体,看看它们是否离得足够近,可以听到它。

    【讨论】:

    • 对,我有这个想法,对我来说,按照它得出结论会导致球体树,因为球体树将空间分开,但在不同节点之间保持负载相似的方式(至少据我所知)。
    • 如果不同类型的交互具有不同的最大范围,则类似球体树(尽管我可能会使用 K-D 树或八叉树)会更好。请参阅:stackoverflow.com/questions/50699240/…。但是,对于固定范围,图块更简单、更快。而不是一棵树,您只需要一个从瓦片位置到居住者列表的哈希图,仅适用于非空瓦片。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2012-04-15
    • 2013-12-18
    • 1970-01-01
    • 2023-03-26
    • 2011-03-11
    相关资源
    最近更新 更多