我的WinForms项目有问题。我需要显示创建的迷宫的图像,并且我使用位图。但是空位图(9990,9990)需要400MB以上的内存。有没有办法减少这种内存消耗,或者我需要将位图更改为其他任何内容?
Bitmap bm = new Bitmap(9990, 9990);
谢谢您的帮助。
该单元格和墙壁的大小为10x10 px。
答案 0 :(得分:1)
我通过使用自定义PixelFormat减少了内存使用; 它将内存消耗减少了2-4倍。
var format = System.Drawing.Imaging.PixelFormat.Format16bppRgb565;
inBm = new Bitmap(
CellWid * (maze.finish.X + 2),
CellHgt * (maze.finish.Y + 2), format);
答案 1 :(得分:0)
是否有减少内存消耗的方法?只要您不需要立即渲染整个迷宫即可。您使用10 * 10 * 4 = 400B来存储有关一个单元格的信息。很有可能,您只需要知道该单元格是否为墙即可。那是1位。您可以将400MB减少到125kB,以存储有关整个迷宫的信息。并仅渲染您实际需要的部分。这是一些代码,可以绘制999x999个可以用鼠标移动的“迷宫”单元
BitArray maze = null;
int mazeWidth = 999;
int mazeHeight = 999;
int xPos = 0;
int yPos = 0;
int cellSize = 10;
private void Form1_Load(object sender, EventArgs e)
{
maze = new BitArray(mazeWidth * mazeHeight);
Random rnd = new Random();
for (int i = 0; i < maze.Length; ++i)
{
maze[i] = rnd.Next(4) == 0;
}
xPos = -Width / 2;
yPos = -Height / 2;
DoubleBuffered = true;
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
for (int y = Math.Max(0, yPos / cellSize); y < mazeHeight; ++y)
{
int yDraw = y * cellSize - yPos;
if (yDraw > Height) { return; }
for (int x = Math.Max(0, xPos / cellSize); x < mazeWidth; ++x)
{
if (maze[x + y * mazeWidth])
{
int xDraw = x * cellSize - xPos;
if (xDraw > Width) { break; }
e.Graphics.FillRectangle(
Brushes.Black,
xDraw,
yDraw,
cellSize,
cellSize
);
}
}
}
}
public static int Clamp(int value, int min, int max)
{
if (value < min) { return min; }
if (value > max) { return max; }
return value;
}
int fromX;
int fromY;
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
fromX = e.X;
fromY = e.Y;
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
int w2 = Width / 2;
int h2 = Height / 2;
xPos = Clamp(xPos + fromX - e.X, -w2, mazeWidth * cellSize - w2);
yPos = Clamp(yPos + fromY - e.Y, -h2, mazeHeight * cellSize - h2);
fromX = e.X;
fromY = e.Y;
Invalidate();
}
}