存储 2D 生成的块世界的块信息



我需要优化我的代码,以便最大化我可以在2D块引擎中渲染的块数量。目前,我将我的块存储在一个块数组中,该数组按其位置索引,该位置包含位掩码和块类型信息。这是基本思想:

private Block[,] blocks;
private BlockType[] blockTypes;
for(int x = 0; x < blocks.Length(0); x++){
    for(int y = 0; y < blocks.Length(1); y++){
        blocks[x,y] = new Block(blockTypes[1]);
    }
}
public class Block {
    protected byte bitmask;
    public BlockType blockType;
    public Block(BlockType blockType){
        this.blockType = blockType;
    }
}
public class BlockType
{
    private string _name;
    private int _id;
    private Vector2 _textureMapPosition;
    private bool _useBitmasking;
}

我是否会通过将索引保存到 blockType 而不是副本来节省大量内存?

private Block[,] blocks;
private BlockType[] blockTypes;
for(int x = 0; x < blocks.Length(0); x++){
    for(int y = 0; y < blocks.Length(1); y++){
        blocks[x,y] = new Block(1);
    }
}
public class Block {
    protected byte bitmask;
    public byte blockType;
    public Block(byte blockType){
        this.blockType = blockType;
    }
}

实际上,我最初已经这样做了,但是发现每次我需要在特定位置获取其中一个属性时都必须访问blockType的索引很不方便。请记住,我正在使用加载到内存中的数百万个这样的块。

考虑到你有数百万个块,是的,你会节省大量内存。

为了进行测试,我在 .NET core 中设置了一个控制台程序,并使用 Visual Studio 诊断工具来跟踪内存使用情况。这是代码:

  class Program
  {
      public static Block[,] blocks = new Block[10000, 10000];
      public static BlockType[] blockTypes = new BlockType[5];
      static void Main(string[] args)
      {
          populate();
      }
      static void populate()
      {
          for (int x = 0; x < 10000; x++)
          {
              for (int y = 0; y < 10000; y++)
              {
                  blocks[x, y] = new Block(blockTypes[1]);
              }
          }
      }
  }

方法 1 - 平均 13 秒,使用 3.8 GB 内存。

方法 2 - 平均 12 秒,使用 3.0 GB 内存。

两者的CPU负载也大致相同。

最新更新