位图高内存使用率

时间:2019-01-27 05:32:49

标签: c# winforms bitmap

我的WinForms项目有问题。我需要显示创建的迷宫的图像,并且我使用位图。但是空位图(9990,9990)需要400MB以上的内存。有没有办法减少这种内存消耗,或者我需要将位图更改为其他任何内容?

Bitmap bm = new Bitmap(9990, 9990);

谢谢您的帮助。

该单元格和墙壁的大小为10x10 px。

https://i.stack.imgur.com/yj9CA.png

2 个答案:

答案 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();
    }
}