2011-11-24 6 views
5

¿Es mejor enfoque a utilizar un nuevo cepillo en el evento Paint es decirQué es mejor enfoque para disponer del cepillo en control de usuario

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

o definir una vez en la parte superior y disponer en el método dispose es decir

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

No se puede ver ningún motivo para crear una nueva instancia cada vez que se llama a OnPaint, por lo que el segundo enfoque es mejor. –

+0

Utilice el segundo método y congele el pincel ya que no planea cambiarlo. –

Respuesta

0

Desde la perspectiva del rendimiento, preferiría crear un pincel y disponerlo en el método Dispose.

5

Use predefinido Brushes si puede (y no los deseche). Si no puede Sugiero no crea sus pinceles en cada pintura, pero en caché ellos:

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

ADEMÁS: La mejor respuesta a esta cuestión puede ser "depende de la tarea". La creación de pincel es costosa, debido a los propios pinceles (se trata de un contenedor gestionado en un objeto GDI + no administrado), y también debido a la recolección de basura con todos los pinceles en cada evento Paint. Por lo tanto, si utiliza varios pinceles, es mejor guardarlos en la memoria caché (por supuesto, los pinceles en caché se deben desechar al deshacerse del control del propietario o al cambiar la máscara). Pero si usa solo un pincel (el primer caso) no es necesaria la memoria caché, solo use el pincel usando el bloque

17

La creación y destrucción de objetos de dibujo como bolígrafos y pinceles es muy económica, demora aproximadamente un microsegundo. Una fracción muy pequeña del costo del código que realmente hace el dibujo, generalmente medido en milisegundos. Por lo tanto, debe evitar almacenarlos, que solo ocupa un espacio valioso en el montón de objetos GDI del sistema operativo, un recurso que todos los procesos en ejecución deben compartir. El único objeto de dibujo que es costoso de crear es una fuente. Sin embargo, Winforms resuelve esto almacenando en caché las fuentes internamente.

Hazlo coherente, aplica siempre el usando la instrucción para dibujar objetos que crees.

+0

¿Es costoso el GraphicsPath? –

+4

Hans Passant, ¿podría indicarme el documento que establece los costos de creación y destrucción de objetos gdi? –

+1

Acabo de medirlo. Tu también puedes. –

Cuestiones relacionadas