我正在尋找一種方法來加速繪製我的遊戲引擎,這是當前的重要瓶頸,並且會導致速度變慢。我正在將它轉換爲XNA,但我注意到了一些東西。爲什麼繪製OnPaint圖形比圖像圖形更快?
說我有一個小圖像,我已經加載。
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
等之類的內容,但我沒有做任何工作來彌補這一令人難以置信的性能差距。我無法找到兩個圖形對象之間的任何區別。是什麼賦予了?
我對System.Diagnostics.Stopwatch
的測試表示,第一個代碼片段的運行速度約爲7100 fps,而第二個代碼片段的運行速度僅爲280 fps。我的參考圖像是VS2010ImageLibrary\Objects\png_format\WinVista\SecurityLock.png
,它是48x48像素,我修改爲72 dpi而不是96,但這些也沒有任何區別。
創建圖形對象非常昂貴,我認爲你是正確的,並且作爲使用子句(並創建緩衝區)的一部分的設置將達到性能,但這意味着您不必擔心確保之後圖形對象被銷燬。嘗試在啓動時創建並在運行時重新使用它們,但確保在退出時銷燬它們。 – Frozenskys 2010-04-05 20:25:03
我在我的帖子中說過,我試着離開使用區塊。也就是說,取第二個片段,註釋掉e.Graphics.DrawImage,並將g.DrawImage更改爲e.Graphics.DrawImage。它突然和第一個片段一樣快。 – Tesserex 2010-04-05 20:39:48