2009-06-11 3 views
11

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

Предположим, что первая сделка прошла с рейтингом 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.

+1

Позвольте мне знать, как это работает для вас. – 2009-09-26 11:06:10

+0

Это старый вопрос, но мне интересно, нашли ли вы решение своей проблемы? Проведя довольно много времени, экспериментируя с высокой производительностью в WPF, я обнаружил, что максимальная производительность может быть достигнута за счет использования примитивов WPF вообще, но с использованием API WriteableBitmap. Это или Direct2D. Мне было бы интересно услышать ваши переживания в любом случае. С уважением, –

ответ

11

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

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

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

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

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

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

+0

Это имеет прекрасный смысл и является отличным описанием подхода, который я сейчас пытаюсь сделать. График, который я строил еще в июне, был разработан с использованием предложения Пола Бетса. Но я недавно создал еще один подобный график, и это решение отлично работает. Все, что я делаю, - это обновление только наименьшего числа возможных объектов (в моем IValueConverter), и визуальный слой WPF, похоже, способен справиться с остальными без инцидентов. – Giffyguy

+0

Замечательно! Рад слышать это! – cplotts

+0

@Giffyguy: Вы все еще рендерите 300 000 точек данных или вы их уменьшили? Являются ли эти данные все видимыми на одном экране или вам нужно прокручивать? – 2009-09-27 08:59:00

1

Если вы не используете .NET 3.5 SP1, просто не используйте какие-либо эффекты шейдера. В противном случае там isn't much you need to do в качестве разработчика WPF для обеспечения его аппаратного ускорения.

+4

Хорошо. Но для этого слишком много нагрузки? Я имею в виду, что рендеринг модели с таким количеством точек - это нечто большее, чем я когда-либо видел в моем (хотя и ограниченном) моделировании и визуализации. – Giffyguy

+4

Я предполагаю, что я спрашиваю: должен ли я идти с линейным путем и добавлять точки по мере прохождения транзакций, или мне нужно искать еще одно решение? – Giffyguy

+0

Вы не имеете в виду растровые эффекты? Вместо эффектов шейдера? – cplotts

4

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

11

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

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

+1

OnRender может быть более реалистичным, чем некоторые подходы ... но будьте осторожны, пытаясь управлять WPF в режиме немедленного режима (что переопределение OnRender может побудить вас сделать) ... WPF - это система с сохраненным режимом. Я сам был укушен, сделав именно это. – cplotts

+0

+1 для идеи минимизировать точки на линии, основанные на разрешении устройства. Очень умно. – cplotts

+0

Уменьшение количества очков - это скорее взлом, чем что-либо с WPF, поскольку хост может быть изменен (увеличен/уменьшен), а визуальные эффекты не имеют возможности узнать их истинный размер на экране. – 2009-09-26 12:50:03

4

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

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

+0

Знаете ли вы, как работает WPF DynamicDataDisplay? Использует ли он Visuals? – 2009-09-26 10:46:05

+0

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

+0

У них разные типы карт для разных потребностей. Некоторые люди работают над вкладом DirectX Line Graph, который должен быть быстрым. У них есть диаграмма, в которой напрямую используется DrawingContext, который является самым быстрым. Все, что использует систему retentive, будет слишком медленным для 300k различных точек данных (если вы хотите отобразить их все) –

0

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

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

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

я упомянул еще один пост в this Codeproject статье, которая делает многие десятки тысяч 3D участков + анимация и т.д ...

 Смежные вопросы

  • Нет связанных вопросов^_^