Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
快速像素绘制c++;windows窗体 我试图为原始空间入侵者街机制作一个C++模拟器。一切正常,但速度很慢。在对我的项目中的几个功能进行计时后,我发现最大的消耗是我的绘图屏幕功能。需要+100ms,但我需要16ms/帧,例如60Hz。这是我的职责: 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; unsigned char*fb=&state->memory[0x2400]; 位图^bmp=gcnew位图(512,448); 对于(int j=1;j图片box1->图像=bmp;_Windows_Winforms_C++ Cli_Drawing_Pixel - Fatal编程技术网

快速像素绘制c++;windows窗体 我试图为原始空间入侵者街机制作一个C++模拟器。一切正常,但速度很慢。在对我的项目中的几个功能进行计时后,我发现最大的消耗是我的绘图屏幕功能。需要+100ms,但我需要16ms/帧,例如60Hz。这是我的职责: 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; unsigned char*fb=&state->memory[0x2400]; 位图^bmp=gcnew位图(512,448); 对于(int j=1;j图片box1->图像=bmp;

快速像素绘制c++;windows窗体 我试图为原始空间入侵者街机制作一个C++模拟器。一切正常,但速度很慢。在对我的项目中的几个功能进行计时后,我发现最大的消耗是我的绘图屏幕功能。需要+100ms,但我需要16ms/帧,例如60Hz。这是我的职责: 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; unsigned char*fb=&state->memory[0x2400]; 位图^bmp=gcnew位图(512,448); 对于(int j=1;j图片box1->图像=bmp;,windows,winforms,c++-cli,drawing,pixel,Windows,Winforms,C++ Cli,Drawing,Pixel,fb是我的帧缓冲区,一个字节数组,每个字节有8个像素,1代表白色,0代表黑色 浏览互联网时,我发现“慢的部分”是SetPixel方法,但我找不到更好的方法来实现这一点。多亏了厌恶评论,我解决了这个问题。我没有重新绘制每个像素,而是先将图像清除为黑色,然后只绘制白色像素。我必须使用缓冲区来防止闪烁 unsigned char *fb = &state->memory[0x2400]; Bitmap ^ bmp = gcnew Bitmap(512, 4

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


浏览互联网时,我发现“慢的部分”是SetPixel方法,但我找不到更好的方法来实现这一点。

多亏了厌恶评论,我解决了这个问题。我没有重新绘制每个像素,而是先将图像清除为黑色,然后只绘制白色像素。我必须使用缓冲区来防止闪烁

        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;

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

您可以尝试的一件简单的事情是
g.Clear(Color::Black);
其中
g
是图像中的
Graphics
对象。然后您可以消除
SetPixel(…,Color::Black)
,这可能足以获得您所需的性能。值得一试,thx;这里有一个链接可能会有所帮助:很好,我将在下一个项目中使用它。我正在尝试您的第一个解决方案,它工作得非常好,只有clear功能使屏幕闪烁,现在您仍然有
设置像素
瓶颈,但是它工作得更好,只是因为屏幕大部分是黑色的。你真的应该使用
LockBits
。是的,我知道,对于这个项目,“清除”解决方案工作得很好。我现在开始使用一个更复杂的模拟器,使用LockBits解决方案
        Bitmap ^def = gcnew Bitmap(20, 20);
        this->pictureBox1->Image = def;