首页 > 解决方案 > 在球形树上吠叫还是去别处看?

问题描述

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

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

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

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

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

(我是 ac# 程序员(主要是),但我正在寻找一个合乎逻辑的答案,而不是一个代码)

我发现的关于球体树的参考资料;

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-structurestreelogic

解决方案


如果对象只需要与例如 <= 100m 以外的对象交互,那么您可以将世界划分为 100m x 100m 的瓦片(或体素),并跟踪每个非空瓦片中的对象。

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


推荐阅读