singlepost

ускорение прорисовки WPF << На главную или назад  

Есть пользовательский контрол унаследованный от ContentControl. В нём перегружен метод прорисовки.

protected override void OnRender(DrawingContext dc)
{

…// в кратце в point[] присваиваются 50000 точек
…// для прорисовки одной кривой линии

StreamGeometry geometry = new StreamGeometry();

using (StreamGeometryContext ctx = geometry.Open())
{
ctx.BeginFigure(points[0], false, false);
ctx.PolyLineTo(points, true, false);
}

dc.DrawGeometry(Foreground, new Pen(Foreground, 1.0), geometry);

}

всё это дело несколько "тормозит" при изменениях размера окна и прочей прорисовке, что сильно отражается на нервной составляющей того, кто смотрит на отображаемый график.

Какие способы ускорения прорисовки графики в WPF можете посоветовать?)

7 ответов в теме “ускорение прорисовки WPF”

  1. 7
    Леонид Максимов ответил:

    кстати, да. StreamGeometry не обязательно создавать каждый раз. выполнять только dc.DrawGeometry(Foreground, new Pen(Foreground, 1.0), geometry); должно быть достаточно, так как геометрия нигде больше к экрану не привязывается.

  2. 6
    Павел Потапов ответил:

    Вопрос на засыпку… а зачем каждый раз при перерисовке создавать StreamGeometry? Подозреваю, что тормоза именно при создании… При изменении размеров окна достаточно менять Transform у геометрии. Есть такое подозрение, что это будет работать быстрее.

    ЗЫ А вообще, лучше попрофилировать и посмотреть, что тормозит больше всего.

  3. 5
    Жека Кирпичев ответил:

    > выборка до 5000 точек не убирает торможения
    Это невозможно. Где-то ошибка, либо тормозит сам процесс выборки.
    Выборка до числа точек N, где N > горизонтального размера окна, не имеет смысла.

  4. 4
    Мопедий Дрынов ответил:

    И это дело распараллелить можно, вынося перерисовку буфера в отдельный поток. А вот антиалайсинг захавает нехило, если его производить на цпу)

  5. 3
    Леонид Максимов ответил:

    невидимый буфер бОльшего размера и копирование с масштабированием и антиалиасингом. перерисовкой графика займешься когда будет время, а пока пользователь меняет размеры окна – не надо.

  6. 2
    Саня Александрович ответил:

    вообще эти 50000 это уже выборка из 385000 точек) это оцифрованный радио сигнал, который надо видеть полностью.

    и даже выборка до 5000 точек не убирает торможения, а лишь уменьшает.

  7. 1
    Мопедий Дрынов ответил:

    А нафига строить график по 50000(!) точкам? ведь юзера скорее всего будут интересовать отдельные экстремумы. Проанализируй эти точки перед отрисовкай и выкинь "лишние". а если юзеру нужна точность, то добавь возможность масштабирования, при которой будет отображаться не весь график, а его часть, но с большей плотностью точек.
    з.ы Производи отрисовку в невидимом буфере, а потом переводи на экран

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.