簡體   English   中英

什么是在用戶控件中配置畫筆的更好方法

[英]What is better approach to dispose Brush in User Control

是否更好的方法在Paint事件中使用新的Brush,即

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);
}

或者在頂部定義一次並在Dispose方法中處理即

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

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

使其一致,始終將using語句應用於您創建的繪圖對象。

如果可以,請使用預定義的畫筆 (並且不要丟棄它們)。 如果你不能建議不要在每個油漆上創建刷子,而是緩存它們:

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緩存 - 只使用使用塊中的畫筆

從性能的角度來看,我更喜歡創建一個畫筆並將其配置在Dispose方法中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM