Есть пользовательский контрол унаследованный от 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 можете посоветовать?)
13 октября 2009 в 0:00
кстати, да. StreamGeometry не обязательно создавать каждый раз. выполнять только dc.DrawGeometry(Foreground, new Pen(Foreground, 1.0), geometry); должно быть достаточно, так как геометрия нигде больше к экрану не привязывается.
12 октября 2009 в 13:01
Вопрос на засыпку… а зачем каждый раз при перерисовке создавать StreamGeometry? Подозреваю, что тормоза именно при создании… При изменении размеров окна достаточно менять Transform у геометрии. Есть такое подозрение, что это будет работать быстрее.
ЗЫ А вообще, лучше попрофилировать и посмотреть, что тормозит больше всего.
12 октября 2009 в 9:01
> выборка до 5000 точек не убирает торможения
Это невозможно. Где-то ошибка, либо тормозит сам процесс выборки.
Выборка до числа точек N, где N > горизонтального размера окна, не имеет смысла.
12 октября 2009 в 0:03
И это дело распараллелить можно, вынося перерисовку буфера в отдельный поток. А вот антиалайсинг захавает нехило, если его производить на цпу)
12 октября 2009 в 0:02
невидимый буфер бОльшего размера и копирование с масштабированием и антиалиасингом. перерисовкой графика займешься когда будет время, а пока пользователь меняет размеры окна – не надо.
12 октября 2009 в 0:00
вообще эти 50000 это уже выборка из 385000 точек) это оцифрованный радио сигнал, который надо видеть полностью.
и даже выборка до 5000 точек не убирает торможения, а лишь уменьшает.
11 октября 2009 в 23:05
А нафига строить график по 50000(!) точкам? ведь юзера скорее всего будут интересовать отдельные экстремумы. Проанализируй эти точки перед отрисовкай и выкинь "лишние". а если юзеру нужна точность, то добавь возможность масштабирования, при которой будет отображаться не весь график, а его часть, но с большей плотностью точек.
з.ы Производи отрисовку в невидимом буфере, а потом переводи на экран