【问题标题】:A container for accessing contents by 2d/3d coordinates通过 2d/3d 坐标访问内容的容器
【发布时间】:2010-09-11 14:08:42
【问题描述】:

有很多游戏通常可以看作是一堆散布在空间中的物体,一个很常见的操作是在一个子区域中挑选所有物体。典型的例子是在大地图上有大量单位的游戏,以及影响特定半径内单位的爆炸。这需要选择范围内的每个单位以应用爆炸的效果。

现在,有多种存储对象的方法可以有效地选择子区域。最简单的方法大概是把地图划分成一个网格;在一个区域中挑选单位将只选择受影响的网格部分,并进行细粒度的坐标检查,检查区域内不是 100% 的网格图块。

我不喜欢这种方法的地方在于回答“网格图块应该有多大?”太大了,效率可能会成为一个真正的问题。太小了,如果游戏世界足够大,网格会占用大量内存(如果游戏是 3d,则可能会变得荒谬)。甚至可能没有合适的中庸之道。

上述问题的明显解决方案是制作具有某种智能细分的大网格,例如伪树结构。正是在这一点上,我确定我对过早的优化还很遥远。 (然后有适当的动态四叉树/八叉树,但代码更复杂,我什至不相信它会表现得更好。)

所以我的问题是:上述问题有标准解决方案吗?在 STL 容器的行中,可以存储任何具有坐标的对象,并检索特定区域内的对象列表?它不必与我上面描述的不同,只要它是经过深思熟虑并被认为“足够好”的东西。

如果在 Python 中实现了该算法,则加分,但 C 也可以。

【问题讨论】:

    标签: python c containers


    【解决方案1】:

    编写实用程序的第一步是接受某些常数的选择来自现实世界的考虑,而不是超越数学真理。这尤其适用于游戏设计/世界模拟类型编码,如果您坚持尝试对现实世界进行最佳建模,您将永远无法到达任何地方。 :-)

    如果您的对象都具有相当统一的大小,我会选择与平均对象大小成比例的网格大小,然后继续。这是最简单的 - 请记住,即使您最终搜索的对象超出了绝对必要的数量,简单也会为您带来一些速度!

    如果您的对象大小差异很大 - 例如,如果您尝试使用相同的引擎来处理子弹、老鼠、人类、巨型怪物、车辆、小行星、行星等,事情就会变得更加困难。如果是这样的话在这种情况下,一种普遍接受(但丑陋)的方法是根据您所处的情况类型使用不同的“游戏模式”。除此之外,一个想法可能是使用带有二叉树细分的大网格累积太多小物体后的网格单元格。

    另外:如果您使用浮点坐标,则需要注意网格大小的精度和舍入问题,因为靠近原点的点比远离原点的点具有更高的精度,这可能导致网格单元错过某些对象的错误。

    【讨论】:

    • 感谢您的细心回复。你基本上证实了我自己的想法/假设。请问有游戏开发经验吗?我首先提出这个问题的原因是为了弄清楚我是否缺少一些出色/明显的解决方案。但是,如果答案是“否”并且来自具有相关经验的人,这就是我想知道的全部内容。
    • 我有过年轻时尝试构建“理想”引擎的经历。 :-) 我也是老派 Doom/Quake 模组的一员,所以我非常熟悉他们的工作原理。
    【解决方案2】:

    Here is a free book available online 将回答您的问题。 具体看第 18 章关于碰撞检测和交叉。

    【讨论】:

      【解决方案3】:

      我对游戏编程一无所知,但我想(基于直觉和我过去读过的内容)一个完整的网格对于大空间来说会变得非常低效;你会在存储和时间上都失败,因为你会融化缓存。

      STL 容器基本上是一维的。是的,像setmap 这样的东西允许你定义任意的排序关系,但它仍然只在一维中排序。如果您想做得更好,您可能需要使用四叉树、kd-tree 或类似的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-16
        • 1970-01-01
        • 2018-09-07
        • 2012-03-06
        • 1970-01-01
        • 2020-12-24
        • 1970-01-01
        相关资源
        最近更新 更多