我需要优化我的代码,以便最大化我可以在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负载也大致相同。