[英]Why is drawing to OnPaint graphics faster than image graphics?
我正在寻找一种方法来加速我的游戏引擎的绘制,这是目前的重要瓶颈,并导致减速。 我正处于将其转换为XNA的边缘,但我只是注意到了一些东西。
说我有一个我已加载的小图像。
Image img = Image.FromFile("mypict.png");
我们想要在屏幕上绘制一个图片框。 所以我们有一个处理程序。
pictureBox1.Paint += new PaintEventHandler(pictureBox1_Paint);
我希望我们加载的图像在图片框上平铺(毕竟这是一个游戏)。 为什么这个代码:
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);
}
超过此代码的时间超过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);
}
为了消除这一点,我试着评论出最后的e.Graphics.DrawImage(这意味着我没有看到任何东西,但它摆脱了第一个例子中没有的调用)。 在第一个例子中,我还在使用块(不必要地),但它仍然是非常快。 我已经设置了g
属性来匹配e.Graphics
- 像InterpolationMode
, CompositingQuality
等,但我没有做任何事情来弥补这个令人难以置信的性能差距。 我发现两个Graphics对象之间没有任何区别。 是什么赋予了?
我使用System.Diagnostics.Stopwatch
测试表明,第一个代码片段的运行速度约为7100 fps,而第二个代码片段的运行频率为280 fps。 我的参考图像是VS2010ImageLibrary\\Objects\\png_format\\WinVista\\SecurityLock.png
,它是48x48像素,我修改为72 dpi而不是96,但这些也没有区别。
当您绘制到屏幕时,操作系统可以利用图形适配器中的特殊硬件来执行简单的操作,例如复制图像。
我两个都要大约5毫秒。 7100 fps的是太快了由GDI +做的软件渲染。 视频驱动程序众所周知地欺骗赢得基准,他们可以检测到不必执行BitBlt,因为图像没有改变。 尝试将随机值传递给e.Graphics.TranslateTransform以消除作弊。
你确定差异不是来自使用块,即设置try-finally块并从图像缓冲区创建Graphics实例。
我很容易看到后者是一个昂贵的操作,不像paint事件,你只需要一个已经创建的图形实例的引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.