[英]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.