快速像素绘制c ++窗体

时间:2015-08-23 15:37:19

标签: windows winforms c++-cli drawing pixel

我正在尝试为原始的空间入侵者街机机器制作一个c ++模拟器。一切正常,但很慢。在我的项目中计时几个功能后,我发现最大的耗尽是我的绘制屏幕功能。它需要+ 100ms但我需要16ms /帧,例如60赫兹。这是我的功能:

unsigned char *fb = &state->memory[0x2400];
Bitmap ^ bmp = gcnew Bitmap(512, 448);

for (int j = 1; j < 224; j++)
{
    for (int i = 0; i < 256; i+=8)
    {
        unsigned char pix = fb[(j * 256 / 8) + i / 8];
        for (int p = 0; p < 8; p++)
        {
            if (0 != (pix & (1 << p)))
            {
                bmp->SetPixel(i + p, j, Color::White);
            }
            else
            {
                bmp->SetPixel(i + p, j, Color::Black);
            }
        }
    }
}
bmp->RotateFlip(RotateFlipType::Rotate270FlipNone);
this->pictureBox1->Image = bmp;

fb是我的帧缓冲区,一个字节数组,每个字节8像素,1表示白色,0表示黑色。

浏览互联网我发现&#34;慢速部分&#34;是SetPixel方法,但我找不到更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:2)

感谢Loathings评论我解决了这个问题。我首先将图像清除为黑色,然后仅绘制白色像素,而不是重新绘制每个像素。不得不使用缓冲区来防止闪烁

        unsigned char *fb = &state->memory[0x2400];
        Bitmap ^ bmp = gcnew Bitmap(512, 448);
        Image ^buffer = this->pictureBox1->Image;
        Graphics ^g = Graphics::FromImage(buffer);
        for (int j = 1; j < 224; j++)
        {
            for (int i = 0; i < 256; i += 8)
            {
                unsigned char pix = fb[(j * 256 / 8) + i / 8];
                for (int p = 0; p < 8; p++)
                {
                    if (0 != (pix & (1 << p)))
                    {
                        bmp->SetPixel(i + p, j, Color::White);
                    }

                }
            }
        }
        bmp->RotateFlip(RotateFlipType::Rotate270FlipNone);

        g->Clear(Color::Black);
        buffer = bmp;
        this->pictureBox1->Image = buffer;

在初始化时,我添加了下一个代码,以防止引发nullexception,

        Bitmap ^def = gcnew Bitmap(20, 20);
        this->pictureBox1->Image = def;

更新:虽然这种方法适用于我的项目,但考虑到屏幕将主要由黑色像素组成。 GetPixel和SetPixel很慢,不应该与性能敏感的程序一起使用。 LockBits将是最佳选择。我没有实现这个,因为我通过清除图形界面获得了所需的性能