【发布时间】:2015-08-23 15:37:19
【问题描述】:
我正在尝试为原始的太空侵略者街机制作一个 c++ 模拟器。一切正常,但速度很慢。在我的项目中计时了几个功能后,我发现最大的消耗是我的绘图屏幕功能。它需要 +100 毫秒,但我需要 16 毫秒/帧,例如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 表示黑色。
浏览互联网我发现“缓慢的部分”是 SetPixel 方法,但我找不到更好的方法来做到这一点。
【问题讨论】:
-
您可以尝试的一个简单方法是
g.Clear(Color::Black);,其中g是图像中的Graphics对象。然后您可以消除SetPixel(..., Color::Black);,这可能足以获得您需要的性能。 -
值得一试,谢谢;
-
这个链接可能会有所帮助:stackoverflow.com/questions/1563038/…
-
很高兴在下一个项目中使用它。我正在尝试您的第一个解决方案,效果很好,只有清除功能会使屏幕闪烁,现在正在处理中
标签: windows winforms c++-cli drawing pixel