При использовании API на основе DirectX с WPF (то есть SlimDX, SharpDX и т. Д.), Можете ли вы использовать элементы управления размером меньше окна?
В нашем приложении WPF нам необходимо отобразить около 64 измерителей уровня в реальном времени для аудиоприложения. Тесты, которые мы провели в WPF, даже когда мы визуализируем базовые примитивы настолько эффективно, насколько это возможно, мы все еще можем показать, что он находится далеко не там, где должно быть наше приложение, часто так сильно затопляя основной поток, что он не отвечает. для ввода.
Таким образом, мы должны использовать нечто более оптимизированное для графической производительности, например DirectX (через SlimDX или SharpDX) или OpenGL/ES (через Atlas, который преобразует его в вызовы DirectX.)
У меня вопрос: возможно ли создать несколько небольших областей на основе DirectX, каждая из которых представляет отдельный счетчик, или, если на то пошло, это даже правильный подход? Я понял, что вы должны запускать его как минимум для всего окна, а не для его части.
Проблемы, с которыми я сталкиваюсь в последнем случае, - это проблемы воздушного пространства, когда содержимое WPF не может быть перед содержимым DirectX в одном и том же окне, и мы действительно не хотим повторять все наши элементы управления в DirectX, поскольку для других -метр 95% нашего пользовательского интерфейса WPF великолепен!
Я прочитал, что вы можете визуализировать DirectX кистью, затем использовать ее внутри WPF или использовать класс WriteableBitmap, который дает вам прямой доступ к буферам, которые WPF затем использует в своем потоке Render, оба из которых, похоже, не страдают от Проблемы с воздушным пространством, но, похоже, мы вернемся в то же самое место, где WPF является узким местом, поскольку он все еще должен выполнять рендеринг.
Конечно, мы собираемся посвятить несколько недель тому, чтобы протестировать все вышеперечисленные приложения, но мне интересно, могу ли я даже двигаться в правильном направлении и / или есть ли какие-то предостережения, которых можно избежать, общаясь с людьми с опытом, делающим что-то подобное, чтобы избежать распространенных ошибок и т.д. Как таковые, любые комментарии будут оценены.
Я надеюсь, что мы, возможно, даже сможем открыть вики где-нибудь, чтобы обсудить эту тему, так как она кажется популярной, хотя и распространяется повсеместно, затрудняя для новых участников получение информации, которую они ищут.
2 ответа
При взаимодействии wpf / d3d вы всегда должны пытаться создать наименьшее количество вызовов взаимодействия. Поэтому вы должны предпочесть рендеринг всех измерителей уровня 64 в одной цели рендеринга (также это позволяет вам пакетировать ваш примитивный рендеринг и рисовать все за наименьшее количество вызовов GPU).
Вы должны попытаться использовать API D3DImage, который позволяет вам поделиться своей собственной текстурой D3D с рендерером wpf.
Если WPF действительно не может обработать эти 64 движущихся бара, вы можете использовать один D3DImage и использовать Direct3D9 для рендеринга сразу всех баров прямо на него. Для вашего конкретного сценария у вас не должно быть проблем с производительностью.