2012-08-02 55 views
2

只是想知道最佳做法或代碼效率,我有這段代碼:用C#繪圖的代碼效率?

只需注意:我正在使用.Net Compact Framework。

protected override void OnPaint(PaintEventArgs e) 
{ 
    if (BmpScreen == null) 
    { 
     BmpScreen = new Bitmap(ClientRectangle.Width, ClientRectangle.Height); 
    } 

    using (Graphics gBmpScreen = Graphics.FromImage(BmpScreen)) 
    { 
     // some drawing using gBmpScreen 
    } 
    // finally 
    e.Graphics.DrawImage(BmpScreen, 0, 0); 
} 

在這段代碼在Paint方法我創建一個Graphics對象每次

我的問題是它更好地做這樣或者是更好地創建圖形對象只有一次在一開始的時候 ?

+3

'PaintEventArgs'已通過[圖形屬性](http://msdn.microsoft.com/zh-cn/library/system.windows.forms.painteventargs.graphics.aspx)爲您提供'圖形'對象。你爲什麼不能使用已經創建並交給你的那個? – vcsjones 2012-08-02 13:33:53

+0

答案應該相當明顯,反覆繪製相同的位圖通常效率不高。如果您不重複繪製相同的東西,則不應使用位圖,而應使用DoubleBuffered屬性並繪製到e.Graphics。 – 2012-08-02 13:37:01

+0

我正在使用.Net Compact Framework ... – 2012-08-02 13:41:25

回答

0

我不確定性能的差異,但我建議在OnResize中分配和處理後臺緩衝區位圖和圖形對象。我發現,對於大多數自定義控件,您可以將更新後臺緩衝區的實際工作與數據更改發生的位置儘可能接近,並簡化OnPaint以僅將後臺緩衝區位圖傳輸至系統的圖形。這對我編寫的自定義圖形控件非常有效,因爲數據沒有響應用戶交互而改變。它包含在一個手勢滾動控件中,並大大改進了滾動動畫。但是你可以通過調用Update()來響應用戶交互的變化來擴展這個模式來處理更多的交互控件,以強制處理器範圍內的OnPaint。

+0

我沒有使用OnResize – 2012-08-22 11:19:43

+0

我推薦在OnResize中分配和配置後臺緩衝區位圖和圖形的原因是因爲當您的控件調整大小時,您需要不同大小的後臺緩衝區對象。通過在每個OnPaint上分配Graphics對象,您會付出一定的性能影響,但您可以簡單地測試並比較性能差異,方法是將您的Graphics分配給對象,同時將其分配給Bitmap。通過將繪圖代碼移出OnPaint,您可能會看到更多的性能,並且更接近您處理模型更改的位置,而不是從後臺緩衝區分配中進行更改。 – Damon8or 2012-08-23 15:13:17