Подтвердить что ты не робот

Может ли WPF создать линейный путь с 300 000 точек в среде с высокой чувствительностью к производительности?

Простой графический граф 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.

4b9b3361

Ответ 1

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

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

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

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

Глава 14 в Pro WPF в С# 2008 от Matthew MacDonald имеет отличный раздел (озаглавленный "Визуальные данные" ) при программировании на визуальном уровне WPF. Глава 2 В WPF Control Development Unleashed также есть раздел на стр. 13, где он обсуждает, как подход DrawingVisual идеально подходит для компонента построения диаграмм. Наконец, Charles Petzold написал статью MSDN Magazine где лучшие общим решением для графика рассеяния был подход DrawingVisual.

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

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