我正在寻找一种加速我的游戏引擎绘图的方法,因为当前这是一个重要的瓶颈,导致游戏速度变慢。我正准备将其转换为XNA,但是我刚刚注意到了一些问题。
比如说,我有一个已经加载好的小图像。
Image img = Image.FromFile("mypict.png");
我们在屏幕上有一个picturebox,我们想要在上面绘制内容。因此我们需要一个处理程序。
pictureBox1.Paint += new PaintEventHandler(pictureBox1_Paint);
我希望我们加载的图片能够在picturebox上平铺(毕竟这是一个游戏)。为什么这段代码会出问题:
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(这意味着我看不到任何东西,但是可以摆脱第一个示例中没有的调用)。我还在第一个示例中保留了using块(不必要),但它仍然非常快。我设置了g的属性以匹配e.Graphics - 例如InterpolationMode,CompositingQuality等,但无论我做什么都无法弥合这种性能差距。我找不到两个Graphics对象之间的任何区别。怎么回事?
我的测试使用System.Diagnostics.Stopwatch表明,第一个代码片段的运行速度约为7100 fps,而第二个代码片段的运行速度仅为280 fps。我的参考图像是VS2010ImageLibrary\Objects\png_format\WinVista\SecurityLock.png,大小为48x48像素,并将其修改为72 dpi而不是96,但这些也没有任何区别。
e.Graphics.TranslateTransform((float)rand.NextDouble(), (float)rand.NextDouble());
。这导致帧速从7100下降到5000。要再试一次吗? - Tesserex