python - 通过 2d/3d 坐标访问内容的容器

标签 python c containers

有很多游戏一般可以看做是一堆物体在空间中散开,一个很常见的操作就是拾取一个子区域内的所有物体。典型的例子是在大 map 上有大量单位的游戏,以及影响特定半径内单位的爆炸。这需要选取半径内的每个单位以应用爆炸效果。

现在,有几种存储对象的方法可以有效地选取子区域。最简单的方法可能是将 map 划分为网格;在一个区域中选取单元将涉及仅选择受影响的网格部分,并对不是 100% 位于该区域内的网格图 block 进行细粒度坐标检查。

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

上述问题的明显解决方案是制作一个带有某种智能 segmentation 的大型网格,如伪树结构。正是在这一点上,我确信我已经进入了过早的优化阶段。 (然后有适当的动态四叉树/八叉树,但编码起来更加复杂,我什至不相信它会表现得更好。)

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

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

最佳答案

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

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

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

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

关于python - 通过 2d/3d 坐标访问内容的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3691278/

相关文章:

异或交换会导致溢出吗?它是否适用于 float ?

c - 有没有更好的方法来管理C中的文件指针?

python - 根据分隔符拆分字符串列并将其转换为 Pandas 中的字典,无需循环

python - 在python中对名称列表进行排序

Python 从标题中获取列宽

C-K&R 表达式 : evaluate a reverse Polish expression from the command line

amazon-web-services - 我应该使用 docker (nginx) 来提供 SPA 服务吗?

networking - Docker 桥接网络,容器之间的 HTTP 调用非常慢(在 docker 升级之后)

kubernetes - 如何通过 initContainer 使用私有(private)存储库

python - 带有 Eclipse 的 TensorFlow