我需要优化我的代码,以便最大化我可以在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的索引是不方便的。请记住,我正在处理数百万个加载到内存中的块。
答案 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负载大致相同。