为什么比图像图形更快地绘制OnPaint图形?

Tes*_*rex 7 c# performance drawing gdi+

我正在寻找一种方法来加速我的游戏引擎的绘制,这是目前的重要瓶颈,并导致减速.我正处于将其转换为XNA的边缘,但我只是注意到了一些东西.

说我有一个我已加载的小图像.

    Image img = Image.FromFile("mypict.png");
Run Code Online (Sandbox Code Playgroud)

我们想要在屏幕上绘制一个图片框.所以我们有一个处理程序.

    pictureBox1.Paint += new PaintEventHandler(pictureBox1_Paint);
Run Code Online (Sandbox Code Playgroud)

我希望我们加载的图像在图片框上平铺(毕竟这是一个游戏).为什么这个代码:

    void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        for (int y = 0; y < 16; y++)
            for (int x = 0; x < 16; x++)
                e.Graphics.DrawImage(image, x * 16, y * 16, 16, 16);
    }
Run Code Online (Sandbox Code Playgroud)

超过此代码的时间超过25倍:

    Image buff = new Bitmap(256, 256, PixelFormat.Format32bppPArgb); // actually a form member
    void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        using (Graphics g = Graphics.FromImage(buff))
        {
            for (int y = 0; y < 16; y++)
                for (int x = 0; x < 16; x++)
                    g.DrawImage(image, x * 16, y * 16, 16, 16);
        }
        e.Graphics.DrawImage(buff, 0, 0, 256, 256);
    }
Run Code Online (Sandbox Code Playgroud)

为了消除这一点,我试着评论出最后的e.Graphics.DrawImage(这意味着我没有看到任何东西,但它摆脱了第一个例子中没有的调用).在第一个例子中,我还在使用块(不必要地),但它仍然是非常快.我已经设置g了匹配的属性e.Graphics- 比如InterpolationMode,CompositingQuality等等,但我没有做任何事情弥补这个令人难以置信的性能差距.我发现两个Graphics对象之间没有任何区别.是什么赋予了?

我的测试System.Diagnostics.Stopwatch表明,第一个代码片段的运行速度约为7100 fps,而第二个代码片段的运行频率为280 fps.我的参考图像是VS2010ImageLibrary\Objects\png_format\WinVista\SecurityLock.png48x48像素,我修改为72 dpi而不是96,但这些也没有区别.

Mar*_*som 1

当您在屏幕上绘图时,操作系统能够利用图形适配器中的特殊硬件来执行简单的操作,例如复制图像。