В настоящее время я разрабатываю программное обеспечение, которое включает отображение показателей производительности в режиме реального времени в виде графиков и диаграмм. Мне нужно получить данные, обработать данные и отобразить изображение как можно быстрее. Мой бэкэнд написан на C++, и я нахожусь в той точке, когда мне нужно сделать выбор в отношении внешнего интерфейса. Учитывая, что мой бэкэнд написан на C++, я был склонен использовать MFC. Другой альтернативой является использование WPF C# для внешнего интерфейса и взаимодействие с моим внутренним интерфейсом C++. Недавно я прочитал, что WPF обеспечивает аппаратное ускорение, это должно помочь мне добиться высокой частоты кадров. Аппаратное обеспечение MFC также ускоряет графику? Имеет ли значение аппаратное ускорение? Учитывая аппаратное ускорение WPF, делает ли это WPF наиболее эффективной альтернативой для графики в моем случае?
Аппаратное ускорение в MFC
Ответы (2)
Я считаю, что WPF обеспечивает аппаратное ускорение с использованием DirectX 9. Однако для линейных графиков ограничивающим фактором является количество элементов интерфейса. Мы создаем программу в WPF, которая отображает данные sEMG в реальном времени с использованием диаграмм Telerik. Их можно настроить для использования ускорения Direct2D, что немного повышает производительность, если у вас много точек данных. Это все еще дергается, потому что вы не можете управлять потоком рендеринга WPF.
Это зависит от количества функций, которые вам нужны на графике. Если приоритетом является гладкое шелковистое отображение в реальном времени, не используйте WPF.
Visual Studio 2010 добавила классы в MFC для поддержки использования рендеринга Direct2D из программ MFC.
Чтобы использовать Direct2D, вы начинаете с вызова EnableD2DSupport()
в OnCreate
вашего представления (технически я полагаю, что это не обязательно должно быть в OnCreate
, но это обычное место). Затем вы будете получать AFX_WM_DRAW2D
сообщения, когда контекст отображения D2D нуждается в обновлении, поэтому обычно вы хотите добавить обработчик для этого и реагировать на него, отображая свой контент по мере необходимости.
Еще одна возможность, которую следует рассмотреть, — это использование существующего элемента управления для рисования графиков. Их довольно много, в том числе бесплатные с довольно либеральным лицензированием. Например, в CodeProject есть ряд элементов управления диаграммами, несколько которые используют D2D для рисования, и многие другие, которые этого не делают.
Честно говоря, я был бы немного удивлен, если бы информация на диаграммах обновлялась достаточно быстро, чтобы скорость прорисовки, как правило, имела огромное значение. В большинстве типичных случаев реальным ограничением будет способность пользователя понять, что вы рисуете. Пользователь просто не может наблюдать за 100 различными графиками, каждый из которых обновляется, скажем, с частотой 60 Гц, и возлагать большие надежды на то, что из большинства из них будет извлечен реальный смысл. В большинстве случаев реальная задача состоит не в том, чтобы быстрее получить больше данных, а в том, чтобы предоставить пользователю лучшие способы сосредоточиться на нескольких вещах, за которыми он может следить за раз, и (например) привлечь его внимание к важным изменениям, когда это необходимо. .