3

我正在开发一款 Minecraft 风格的游戏,我需要一种方法来减少渲染世界的数量。目前,我正在使用一种天真的、渲染一切的方法,它存在明显的缩放问题。我需要一种方法来获取一组块,并以某种方式找出哪些块正在接触空气、水或任何其他半透明块。

我对使用 NumPy 或 SciPy 等外部模块持开放态度,尽管他们的一些文档让我有点不知所措。或者,遍历每个块并获取邻居列表也是可以接受的,尽管在 Python 而不是 C 中进行这些计算的性能成本会相当高。

作为记录,我已经尝试查看 NetworkX,但它似乎更多地用于科学分析或寻路,而不是可见性检查。

4

2 回答 2

4

如果您只需要这样做一次,那么性能应该不是问题。如果您.isBoundary在世界发生变化时也增量更新块的属性,您将永远不必再这样做。

但是,如果您的世界太大或充满洞和洞穴以及透明交错与不透明,您仍然会遇到问题。如果您需要动态确定什么是可见的,您可以保留一个八叉树(http://en.wikipedia.org/wiki/Octree),您可以在其中拥有巨大的空气/水/等。作为单个节点(巨型块),标记为“透明”。然后使用“paintbucket”算法(修改为执行 Dijkstra 算法,因此很容易通过检查当前块和原点之间是否存在块来检测您何时“绕过拐角”)快速找出哪个块就在眼前。如果玩家移动缓慢,远处事物的更新可能会显着延迟。

于 2011-07-15T07:08:08.600 回答
2

您可以使用Z-Buffer解决方案。关于速度,我会尽可能多地用 python 编写并使用pypy。我相信 EVE Online(一个成功的 3D MMO)是用 stackless python 编写的。

于 2011-07-15T08:09:43.350 回答