我正在开发一款 Minecraft 风格的游戏,我需要一种方法来减少渲染世界的数量。目前,我使用的是一种朴素的、渲染一切的方法,这种方法存在明显的缩放问题。我需要一种方法来获取一系列 block ,并以某种方式找出哪些 block 接触空气、水或任何其他半透明 block 。
我对使用 NumPy 或 SciPy 等外部模块持开放态度,尽管它们的一些文档让我有点难以理解。或者,遍历每个 block 并获取邻居列表也是可以接受的,尽管在 Python 而不是 C 中进行这些计算的性能成本会非常高。
郑重声明,我已经尝试查看 NetworkX,但它似乎更多地用于科学分析或寻路,而不是可见性检查。
如果您只需要执行一次,性能应该不是问题。如果您还在世界发生变化时增量更新 block 的 .isBoundary
属性,您将永远不必再做一次。
但是,如果您的世界太大或充满洞和洞穴以及透明与不透明交错,您仍然会遇到问题。如果你需要动态地确定什么是可见的,你可以保留一个八叉树 ( http://en.wikipedia.org/wiki/Octree ) 在那里你可以拥有巨大的空气/水/等。作为单个节点(巨型 block ),标记为“透明”。然后使用“paintbucket”算法(经过修改以执行 Dijkstra 算法,因此很容易通过检查当前 block 和原点之间是否存在 block 来检测“绕过一个角落”)快速找出哪个街区就在眼前。如果玩家移动缓慢,则远处事物的更新可能会大大延迟。
我是一名优秀的程序员,十分优秀!