Производительность диспетчера WPF (100-200 обновлений в секунду) - PullRequest
5 голосов
/ 08 ноября 2010

В окне WPF у меня есть линейная диаграмма, которая отображает данные в реальном времени (диаграмма Quinn-Curtis RealTime для WPF).Короче говоря, для каждого нового значения я вызываю метод SetCurrentValue (x, y), а затем метод UpdateDraw () для обновления диаграммы.

Данные поступают через TCP-соединение в другойнить .Каждое новое входящее значение вызывает событие DataReceived, и его обработчик должен отобразить значение на диаграмме, а затем обновить его.Логически, я не могу вызвать UpdateDraw () напрямую, так как моя диаграмма находится в потоке пользовательского интерфейса, который не совпадает с потоком, в котором поступают данные.Действие (UpdateDraw ())) - и это отлично работает, ну, пока я обновляю макс.30 раз / секПри более частом обновлении Dispatcher не может идти в ногу, и диаграмма обновляется медленнее, чем поступают данные. Я проверил это, используя однопоточную ситуацию с симулированными данными, и без Dispatcher проблем не возникало.

Итак, я пришел к выводу, что Диспетчер слишком медленный для этой ситуации .Мне действительно нужно обновлять 100-200 раз / сек!

Есть ли способ поставить турбо на Диспетчер, или есть другие способы решить эту проблему?Любые предложения приветствуются.

Ответы [ 4 ]

10 голосов
/ 08 ноября 2010

Можно использовать общую очередь для передачи данных.

Где данные поступают, вы помещаете данные в конец очереди:

lock (sharedQueue)
{
    sharedQueue.Enqueue(data);
}

В потоке пользовательского интерфейса вы найдете способ прочитать эти данные, например, используя таймер:

var incomingData = new List<DataObject>();

lock (sharedQueue)
{
    while (sharedQueue.Count > 0)
        incomingData.Add(sharedQueue.Dequeue());
}

// Use the data in the incomingData list to plot.

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

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

6 голосов
/ 08 ноября 2010

Вы - помешанные. Вы серьезно НЕ нуждаетесь в 100-200 обновлениях в секунду, особенно, поскольку экран обычно работает со скоростью 60 обновлений в секунду. Люди все равно их не увидят.

  • Ввод новых данных в очередь.
  • Запустить событие извлечения для / для диспетчера.
  • Очистить данные в очереди (без удваиваний, последних действительных выигрышей) и поместить их в. L

30 обновлений в секунду достаточно - люди не увидят разницы. До этого у меня были проблемы с производительностью некоторых финансовых данных при высокой нагрузке с T & S - теперь график выглядит лучше.

Держите Диспетчер движется как можно меньше.

4 голосов
/ 09 ноября 2010

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

Какая польза от обновления чего-либо 200 раз в секунду, когда вы можете ВИДЕТЬ обновления только 60 раз в секунду? Вы также можете пакетировать входящие данные и обновлять график со скоростью 60 кадров в секунду, поскольку вы все равно не сможете увидеть разницу.

Если это не просто отображение данных, а то, что вы делаете с ними что-то еще - скажем, вы контролируете их, чтобы увидеть, достигает ли оно определенного порога - чем я рекомендую разделить систему на 2 части : мониторинг одной части на полной скорости, другая - независимая индикация на максимальной скорости, с которой может работать ваш монитор: 60 кадров в секунду.

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

0 голосов
/ 08 ноября 2010

Рисование WPF происходит в отдельном потоке.В зависимости от сложности вашей диаграммы на вашем компьютере должна быть установлена ​​видеокарта с мега-спуском, чтобы поддерживать скорость 100 кадров в секунду.WPF использует Direct3D для рисования всего на экране, и оптимизация видео драйвера для этого была добавлена ​​в Vista (улучшено в Windows 7).Таким образом, в XP у вас могут возникнуть проблемы только из-за высокой скорости вывода данных в плохо спроектированной ОС.

Несмотря на все это, я не вижу причин печатать информацию на экране со скоростью более 30-60кадров в секунду. Да ладно! Даже FPS-шутерам не нужны такие сильные рефлексы от игрока.Вы хотите сказать мне, что ваш плохой график делает?:) Если с помощью этого вывода вы производите некоторые побочные эффекты, которые вам действительно нужны, то это совсем другая история.Расскажите нам больше о проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...