Как лучше подходить для удаления кисти в пользовательском контроле - PullRequest
5 голосов
/ 24 ноября 2011

Лучше ли использовать новый случай 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, т.е.

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

Ответы [ 3 ]

17 голосов
/ 24 ноября 2011

Создание и уничтожение объектов рисования, таких как ручки и кисти, очень дешево, занимает около микросекунды. Очень небольшая доля стоимости кода, который фактически выполняет рисование, обычно измеряется в миллисекундах. Поэтому следует избегать их хранения, которое просто занимает драгоценное место в куче объектов GDI операционной системы, ресурс, который должен использоваться всеми запущенными процессами. Единственный объект рисования, который дорого создать, это шрифт. Однако Winforms решает эту проблему путем внутреннего кэширования шрифтов.

Сделайте его непротиворечивым, всегда применяйте оператор с использованием к создаваемым объектам чертежа.

5 голосов
/ 24 ноября 2011

Используйте предопределенные Кисти , если можете (и не утилизируйте их). Если вы не можете, я предлагаю не создавать свои кисти на каждой краске, а кэшировать их:

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. Поэтому, если вы используете несколько кистей, их лучше кэшировать (конечно, кэшированные кисти следует утилизировать при утилизации контроля владельца или при смене кожи). Но если вы используете только одну кисть (в первом случае), кеш не нужен - используйте только кисть в блоке

0 голосов
/ 24 ноября 2011

С точки зрения производительности я бы предпочел создать одну кисть и расположить ее в методе Dispose.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...