使用新的Brush in 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);
}
或在顶部定义一次并在Dispose Method中处理,即
SolidBrush _brush;
protected SolidBrush Brush {
get {
if (_brush == null)
_brush = new SolidBrush(Color.FromArgb(129, 242, 121));
return _brush;
}
}
答案 0 :(得分:17)
创建和销毁画笔和画笔等绘图对象非常便宜,大约需要一微秒。实际绘制代码的代码成本的一小部分,通常以毫秒为单位。因此,您应该避免存储它们,这只占用操作系统GDI对象堆中的宝贵空间,这是一个需要由所有正在运行的进程共享的资源。创建的唯一绘图对象是字体。但是,Winforms通过在内部缓存字体来解决这个问题。
使其保持一致,始终将使用语句应用于绘制您创建的对象。
答案 1 :(得分: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缓存 - 只使用使用块的画笔
答案 2 :(得分:0)
从性能的角度来看,我更喜欢创建一个画笔并将其处理在Dispose方法中。