0

我正在制作一个简单的体素引擎,并且已经提供了相当一部分的知识,所以请多多包涵。我正在尝试存储块的信息(即实体、颜色、深度等)

我相信存储这些信息的最有效方法是在结构中?易于访问(我认为),快速,低内存。任何人,这就是我在代码中所做的。

struct block {
  bool Solid;
  bool BlockR;
  int id;
} AIR, STONE, DIRT, GRASS;

现在我正在尝试找到一种基于信息调用结构的方法。例如:

如果创建了一个块(比如说它是 AIR),那么我可以使用说 mm block.Solid,它会知道我指的是 AIR.Solid ...我不知道这是否有意义,那就是一半我的问题,因为我不知道要搜索什么..任何帮助表示赞赏。

4

2 回答 2

0

体素引擎的第一个问题是它需要的内存量。所以你的结构方法不好。请注意,您将拥有大量具有相同数据的体素,即大量浪费内存。

一种更好的方法是使用哈希表。体素存储一个键,表存储实际使用的不同体素属性集。当您更改体素的属性(例如,将其颜色从蓝色更改为绿色)时,您可以使用带有新属性的哈希函数作为输入,并查看哈希表以找到生成的键。如果使用该键,请将其分配给体素。如果不是,则将新的体素属性组合存储在哈希表中,并将新的 kay 分配给体素。

这样做的一个问题是体素消除:当我们从游戏中删除一个体素时,我们总是必须从哈希表中删除它的体素属性?答案是不。请注意,可能有多个体素在使用该属性。
为了解决这个问题,您可以实现一个简单的引用计数系统。

您的 ID 问题很容易解决:体素引擎通常基于八叉树,并且与其他树一样,您可以生成一个简单的命名约定:

(0)-->(10)-->(100)  
  |      |-->(101)  
  |
  |-->(11)-->(110)
         |-->(111)

注意:这个约定有一个名字,但我不记得了。如果有人知道,请编辑问题。

于 2013-07-20T09:01:48.927 回答
0

对于一个简单的体素引擎,你甚至不需要任何结构,它们可以被unsigned chars 替换,指定块的 id。然后使用其他数据创建数组,如纹理(如果你愿意,所有 6 个面),以及当你踩到它或打破它时它会发出什么声音。不要创建关于可靠性的数组;仅 id 就可以告诉您这么多。

如果您坚持使用结构,请加上前缀__declspec(align(4)),这样 CPU 在看到一堆未对齐的数据时就不会倒下并死掉 - 也就是不是 4 字节对齐的 - 数据。它占用了更多内存,但最终执行得更快。

于 2013-07-20T19:35:01.690 回答