【问题标题】:Storing block information for a 2D generated block world为 2D 生成的块世界存储块信息
【发布时间】:2018-06-18 23:55:44
【问题描述】:

我需要优化我的代码,以最大限度地增加我可以在我的 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 的索引很不方便。请记住,我正在处理可能数百万个加载到内存中的这些块。

【问题讨论】:

    标签: c# arrays matrix memory optimization


    【解决方案1】:

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

    为了进行测试,我在 .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 负载也大致相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多