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

时间:2018-01-09 21:19:50

标签: c# arrays matrix memory optimization

我需要优化我的代码,以便最大化我可以在2D块引擎中渲染的块数。目前,我将我的块存储在由其位置索引的块数组中,该块包含位掩码和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(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的索引是不方便的。请记住,我正在处理数百万个加载到内存中的块。

1 个答案:

答案 0 :(得分:0)

考虑到你有数百万块,,你可以节省大量内存。

为了测试,我在.NET核心中设置了一个控制台程序,并使用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 - 使用 3.8 GB 内存平均13秒。

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

两者的CPU负载大致相同。