2010-04-05 73 views
7

我正在尋找一種方法來加速繪製我的遊戲引擎,這是當前的重要瓶頸,並且會導致速度變慢。我正在將它轉換爲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,但這些也沒有任何區別。

回答

1

當您繪製到屏幕上時,操作系統可以利用圖形適配器中的特殊硬件執行簡單的操作,例如複製圖像。

0

您確定區別不在於使用塊,即設置try-finally塊並從圖像緩衝區創建圖形實例。

我可以很容易地看到後者是一個昂貴的操作,不像繪製事件,你只需獲得一個已經創建的圖形實例的引用。

+1

創建圖形對象非常昂貴,我認爲你是正確的,並且作爲使用子句(並創建緩衝區)的一部分的設置將達到性能,但這意味着您不必擔心確保之後圖形對象被銷燬。嘗試在啓動時創建並在運行時重新使用它們,但確保在退出時銷燬它們。 – Frozenskys 2010-04-05 20:25:03

+0

我在我的帖子中說過,我試着離開使用區塊。也就是說,取第二個片段,註釋掉e.Graphics.DrawImage,並將g.DrawImage更改爲e.Graphics.DrawImage。它突然和第一個片段一樣快。 – Tesserex 2010-04-05 20:39:48

1

我得到兩個約5毫秒。 7100 fps是方式對於GDI +完成的軟件渲染速度太快。視頻驅動程序臭名昭着地贏得基準,他們可以檢測到BitBlt不必執行,因爲圖像沒有改變。嘗試將隨機值傳遞給e.Graphics.TranslateTransform以消除作弊。

+0

我在繪圖循環中插入了'e.Graphics.TranslateTransform((float)rand.NextDouble(),(float)rand.NextDouble());'。它從7100減慢到5000 fps。再試一次? – Tesserex 2010-04-05 20:43:16

+0

到底是什麼......相同的改變,在較慢的方法上,使它更快,從280到380 fps! – Tesserex 2010-04-05 20:44:23