我如何在我的Voxel游戏中存储块信息?

我正在尝试做一个体素游戏。

体积块和每个块都有它自己的信息,如耐久性,步声,力量,…

我如何将这些信息存储在块中? 还是将自己的信息保存在自己的内部是真的。

我是否将它们存储在所有块实例或静态属性上?

public class Block { public virtual float durability { get { return 1f; } } public virtual float strength { get { return 1f; } } public virtual StepSound stepSound { get { return new StepSound ( "stone.ogg" ); } } } 

然后通过inheritanceBlock类来创建一个类:

 public class BlockDirt : Block { public override float durability { get { return 0.5f; } } public override float strength { get { return 0.5f; } } public override StepSound stepSound { get { return new StepSound ( "dirt.ogg" ); } } } 

现在我拥有所有BlockDirt实例中的上述属性。

但它需要很多的记忆。 只是觉得我有100 BlockDirt

或者我创建一个基类:

 public class Block { } 

然后inheritance它来创建块:

 public class BlockDirt : Block { public static StepSound stepSound = new StepSound ( "dirt.ogg" ); public static float durability = 0.5f; public static float strength = 0.5f; } 

并为所有BlockDirt实例使用BlockDirt静态属性?

我不知道如何获得类实例的静态属性,但我知道我可以使用reflection,但它比基于实例的数据需要更多的CPU和内存。

我该怎么办?

任何帮助表示赞赏。

我会建议你看flyweight模式 。 它允许您在简单的重复表示使用不可接受的内存量时使用大量数据块或块等对象。 这个原理很好地代表了这张图片:

在这里输入图像描述

基本上有一个实例化的对象 ,它定义了树之间的所有共享属性。 然后你只需要创建位置参数来告诉引擎在哪里显示这个对象。

如果您想了解更多信息,请参阅适用于您的问题的完整示例 。

编辑:几个具体的例子:

  • 在Unity上创建外星人(C#),比较内存使用。 链接
  • 反恐精英例子(JAVA),玩家模型的重用。 链接
  • 一个youtuber(JAVA)的生动的解释。 链接

我把Java的例子作为Java的语法和结构非常类似于C#。 我相信你可以在网上find更多的例子,也许更好的例子。

我不知道“我的世界”是如何做的,但是很久以前,我曾经写过一个“我的世界”的克隆。 你可以看看我是怎么做到的。

  • 有一个块模型 ,存储所有你想要的块types的细节。 该模型有一个ID。 世界上的每个块都通过持有这个模型ID来声明它是哪种types。
  • 块序列化模型 。

我绝对不是说这就是你应该怎么做,或者这是一个很好的办法,但它的工作。 请注意,我当时可能只有17岁,几乎没有任何经验。