Может ли WPF отобразить путь линии с 300 000 точками в чувствительной к производительности среде? - PullRequest
11 голосов
/ 11 июня 2009

Простой линейный график XY: ось X будет представлять полный диапазон возможных процентных значений от 0% на одном конце до 100% на другом. В частности, значение X будет означать ограничение нашего рейтинга, или минимальный рейтинг, который может иметь транзакция, прежде чем она больше не будет приемлемой. Ось Y покажет значения от 0 до общего количества транзакций, которые были выполнены. Значение Y будет представлять собой общее количество транзакций, рейтинг которых превышает текущее значение X (или больше или равно текущему значению X, я еще не решил). При первом построении этого графика транзакции не будут выполнены, поэтому график начнется с "y = 0x".

Допустим, первая транзакция прошла с рейтингом 40%. Рейтинг транзакции указывает на то, что данная транзакция является приемлемой, если наш рейтинг отсечения составляет менее 40%. (... или меньше или равно 40%. Опять же, я еще не решил).

Сначала ось Y масштабируется, чтобы показать диапазон 0-1 (поскольку 1 - общее количество транзакций). Затем строка будет изменена, чтобы указать, что 0 транзакций приемлемы с x = 40 или более, и что 1 транзакция приемлема с x = 40 или менее. Это легко сделать в WPF, просто добавив две точки к пути линии - одну в (40,0), а другую в (40,1) - и затем переместив левую конечную точку линии в (0,1). Правая конечная точка линии останется на (100,0). Затем этот процесс можно повторить для второй транзакции и т. Д.

Проблема в том, что мы будем иметь дело с шестизначным количеством транзакций. и я хочу убедиться, что я в полной мере использую аппаратные возможности векторного рисования WPF, чтобы график не отставал и не зависал от остальной части программы, поскольку он пытается отобразить 300 000 точек на пути одной линии. Или WPF должен обрабатывать такие числа в одно мгновение? Мне нужно найти способ реализовать этот график, не останавливая приложение. Я верю, что платформа векторного рисования WPF предоставит решение, но я не знаю достаточно о том, как использовать WPF, чтобы быть уверенным в том, что я максимально использую возможности высокопроизводительного рендеринга WPF.

Ответы [ 6 ]

11 голосов
/ 25 сентября 2009

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

Если вам нужны производительность и количество визуальных файлов ... Я сомневаюсь, что вы найдете более производительный подход, чем программирование непосредственно на визуальном уровне WPF (ссылки: 1 *). 1006 *, 2 ). Мои первые результаты использования этого подхода были очень положительными.

Это будет даже более производительно, чем переопределение OnRender, так как побудит вас воспользоваться преимуществами подсистемы рисования в сохраненном режиме WPF (где все инструкции рисования кэшируются).

То есть, если все, что вам нужно обновить, это точка на линии, то обновление точки заставит линию Visual обновить, но не заставит остальную часть графика (оси, линии сетки, ...) обновить ... поскольку инструкции по их созданию сохраняются и будут использоваться повторно (поскольку они не обновляются).

Глава 14 в Pro WPF в C # 2008 от Мэтью Макдональда есть большой раздел (под названием «Визуальные элементы») по программированию на визуальном уровне WPF. Глава 2 Разработка управления WPF Unleashed также имеет раздел на странице 13, где он обсуждает, как подход DrawingVisual будет идеальным для компонента построения диаграмм. Наконец, Чарльз Петцольд написал статью MSDN Magazine , где лучшим общим решением для точечного графика был подход DrawingVisual.

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

11 голосов
/ 11 июня 2009

Если вы хотите, чтобы это было быстро, лучшим способом является использование Control и реализация OnRender - обычно это не требуется, но для вашего приложения это может быть.

Кроме того, давайте сделаем шаг назад - экран, на который вы рендеринге, определенно не имеет ширину 300k пикселей; прежде чем приступить к рендерингу, уменьшите буфер, усредняя n узлов в один, пока вы не приблизитесь к разрешению фактического устройства, , а затем нарисуйте его на экране.

4 голосов
/ 12 июня 2009

Возможно, стоит взглянуть на библиотеку WPF DynamicDataDisplay . Я использую его недавно, и у меня нет проблем с большими объемами данных. Это только ранняя версия (на самом деле 0.3), поэтому документации немного, но в ней есть примеры, показывающие, как ее использовать. Надеюсь, этого будет достаточно, чтобы вы начали.

SimulationSample генерирует много данных, так что это хорошее место для начала.

4 голосов
/ 11 июня 2009

Я не знаю ответа, но написание быстрого теста не займет намного больше времени, чем то, что вы опубликовали. Также см. в этой теме для аналогичного обсуждения.

1 голос
/ 11 июня 2009

Если вы не используете .NET 3.5 SP1, просто не используйте никаких шейдерных эффектов. В противном случае не так много, что вам нужно сделать в качестве разработчика WPF, чтобы убедиться, что он использует аппаратное ускорение.

0 голосов
/ 26 февраля 2010

ИМХО, Пол, кажется, находится на правильной дорожке, ознакомьтесь с разделами по сглаживанию карты, в некоторых примерах используются результаты выборов во Флориде 2000 г. (~ 9M голосов, 18 + M всего людей) для наборов данных.

По линии потока от AgileJon, в некотором смысле, я бы просто использовал ручную эмиссию растрового изображения, если бы не было прямой методики, которая бы лучше учитывала ваш набор данных. Я рендеринг визуализаций графиков рассеяния, которые составляют 16 000 000 (16 миллионов +) в секунду, полная 32-битная палитра ARGB.

Вы, кажется, заметили: «Но возвращение к растровым изображениям кажется гигантским шагом назад», я бы не стал так быстро говорить, что вселенная ограничена физическими ограничениями.

Я отослал еще один пост к этой статье codeproject, в которой много десятков тысяч 3D-сюжетов + анимация и т. Д. *

...