2011-11-24 55 views
5

是更好的辦法在Paint事件中使用新的刷機即什麼是更好的方法來處理刷在用戶控制

protected override void OnPaint(PaintEventArgs e) { 
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; 
    using (SolidBrush b = new SolidBrush(Color.FromArgb(129, 242, 121))) { 
     for (int i = 0; i < 12; i++) {  
      e.Graphics.FillPath(b, path[i]); 
     } 
    } 
    base.OnPaint(e); 
} 

或在頂部定義一次,並在處置處理方法即

SolidBrush _brush; 
protected SolidBrush Brush { 
    get { 
     if (_brush == null) 
      _brush = new SolidBrush(Color.FromArgb(129, 242, 121)); 
     return _brush; 
    } 
} 
+2

每次調用OnPaint時都看不到任何理由創建新實例,所以第二種方法更好。 –

+0

使用第二種方法並凍結筆刷,因爲您不打算更改它。 –

回答

0

從性能角度來看,我更願意創建一個畫筆並將其置於Dispose方法中。

5

如果可以(並且不處理它們)使用預定義的Brushes。如果你不能,我建議不要在每個油漆創建筆刷,但它們緩存:

IDictionary<Color, Brush> SolidBrushes; //... cache 
Brush GetSolidBrush(Color color) { 
    if(color.IsSystemColor) 
     return GetSystemBrush(color); 
    Brush result = null; 
    if(!SolidBrushes.TryGetValue(color, out result)) { 
     result = new SolidBrush(color); 
     SolidBrushes.Add(color, result); 
    } 
    return result; 
} 
Brush GetSystemBrush(Color color) { 
    return SystemBrushes.FromSystemColor(color); 
} 

加法:對這個問題的最好答案可能是「取決於任務」。由於畫筆本身(它是託管在非託管GDI +對象上的包裝),刷子的創建非常昂貴,並且因爲在每個Paint事件中都使用了所有這些畫刷的垃圾收集。因此,如果您使用多個筆刷,最好緩存它們(當然,緩存的筆刷應當在處理所有者控制或換膚時處置)。但是如果只使用一個畫筆(第一種情況),則不需要thr緩存 - 僅在使用塊中使用畫筆

17

創建和銷燬繪圖對象(如筆和畫筆)非常便宜,大約需要1微秒。實際繪製的代碼成本的一小部分,通常以毫秒爲單位進行測量。因此,您應該避免存儲它們,這隻佔用操作系統GDI對象堆中的寶貴空間,這是需要由所有正在運行的進程共享的資源。創建昂貴的唯一繪圖對象是字體。但是,Winforms通過在內部緩存字體來解決這個問題。

使它保持一致,請始終將應用語句應用到您創建的繪圖對象。

+0

GraphicsPath是否昂貴? – 2011-11-25 13:08:45

+4

漢斯帕斯坦特,請你指點一下文件,說明gdi對象的創建和銷燬成本? –

+1

我剛剛測量過。你也可以。 –

相關問題