WPF как текстура OpenGL - PullRequest
       3

WPF как текстура OpenGL

4 голосов
/ 07 сентября 2010

Я работаю над симулятором, который использует OpenGL для отображения символов, карт, движущихся объектов ... в виде слоев / текстур.

Мы изучаем различные варианты введения поддержки мультитач в симуляторе.

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

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

Текущая система основана на

  • Основном / хостинговом приложении, написанном на C ++ и OpenGL, которое управляет (запускает, планирует, останавливает ...) WPF-частью и предоставляет контекстную информацию

  • Приложение WPF с поддержкой мультитач, которое реагирует соответственно на основной контекст и на пользовательский ввод

  • COM-компонент для связи между приложением Main / hosting иприложение WPF

  • Мультитач-входы, управляемые определенным уровнем абстракции (обрабатывает TUIO или собственные события)

Планировщик приложения хоста запрашивает приложение WPFдля захвата / растрового изображения каждые xx мс (обычно xx <50-60 мс) и добавляет это растровое изображение в качестве текстуры OpenGL (glTexImage2D) для визуализации окна моделирования. </p>

Текущий способ WPFРендеринг его растрового изображения основан на RenderTargetBitmap.Время рендеринга составляет около 500 мс, что по крайней мере в 10 раз медленнее, чем хотелось бы, и потребляет слишком много ресурсов ЦП (в этом случае WPF использует программный конвейер).

Итак, мои вопросы будут такими:

  • Есть ли способ визуализации растрового изображения окна WPF намного быстрее при сохранении всех его функций (например, прозрачности)?Я знаю об API gdi32, но, похоже, он не поддерживает такие вещи, как прозрачность, и я не знаю, сможем ли мы добиться какой-либо производительности

  • Текущая архитектура не похожа наоптимальный выбор, поскольку выполняются два «рендеринга» (рендеринг самого приложения WPF и рендеринг его растрового изображения).Можно ли будет сделать один раз WPF для рендеринга в некотором пространстве виртуальной памяти, которое может быть непосредственно прочитано приложением Main / hosting?

1 Ответ

1 голос
/ 13 августа 2011

Render API

Прежде всего, вы не должны смешивать WPF и OpenGL, потому что WPF основан на DirectX. Убедитесь, что вы используете WPF на оборудовании DirectX 9.0+ для лучшей производительности.

Рендеринг

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

Управление памятью

Чтобы улучшить обработку памяти, вы можете использовать слабые события (освобождать обработчики событий от объектов, когда обработчик больше не нужен), использовать VirtualizingStackPanels вместо StackPanels, чтобы минимизировать влияние памяти на элементы UI, и использовать замораживаемые объекты. *

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