data-structures - 在球形树上吠叫还是去别处看?
问题描述
场景:大量玩家在 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
解决方案
如果对象只需要与例如 <= 100m 以外的对象交互,那么您可以将世界划分为 100m x 100m 的瓦片(或体素),并跟踪每个非空瓦片中的对象。
然后,当一个物体需要“说话”时,您只需要检查最多 9 个图块中的物体,看看它们是否离得足够近,可以听到它。
推荐阅读
- xslt - 在 PI XSLT 映射中将 xml 字段转换为键/值对
- chef-infra - 通过 Inspec 实现基础设施合规性
- hadoop - 如何使用大数据从两个电子表格中的数据中给出 if 语句的结果?
- javascript - 根据文件名激活引导导航栏项目?
- python - 查找另一行是否存在列元素的组合
- ruby-on-rails-5 - 覆盖 Rails 生成器以将 date_select 更改为 date_field
- javascript - 跟踪嵌入 html 元素的 URL 更改
- angular - ContactListComponent.html:1 ERROR 错误:未找到 ContactComponent 的组件工厂。你把它添加到@NgModule.entryComponents 了吗?
- javascript - 如何创建具有水平和垂直滚动条的固定列的基于 div 的表?
- javascript - 是否可以在不使用事件的情况下检查 CSS 转换是否完成?