Производительность WriteableBitmap(Ex) и DrawingContext

Я создаю пользовательскую структуру пользовательского интерфейса в WPF, где я в основном отказываюсь от встроенной системы компоновки и элементов управления, насколько это возможно. До сих пор я отделялся от UIElement напрямую, но, поскольку я уже выполняю измерения, аранжировку и рендеринг самостоятельно, я думаю, что мог бы отрезать больше от наследия WPF, став еще «ближе к металлу» (особенно когда это доходит до верстки/рендеринга). Насколько близко можно подойти, оставаясь в управляемом коде и не боясь самому делать грязную работу?

Сейчас я играю с концепцией прототипа на стороне, где у меня есть только один элемент, наследуемый от UIElement: объект Root, похожий на урезанный Canvas, который «размещает» остальную часть моего механизма компоновки и направляет в него соответствующие IInputElement преимущества. С этого момента все элементы будут полностью пользовательскими объектами, не наследуемыми ни от чего в WPF, а визуализируются непосредственно в DrawingContext корня (в его методе OnRender).

Теперь меня интересует относительная производительность наличия корневого элемента WriteableBitmap и его ручного рисования, например, с помощью WriteableBitmapEx для удобства. Отсутствие сглаживания не является проблемой, равно как и настраиваемая система проверки попаданий.

Мои мысли в первую очередь заключаются в том, что WriteableBitmap (Ex) не имеет привилегии какого-либо ускорения ускорения графического процессора и, следовательно, будет [намного] медленнее, когда необходимо перерисовать / преобразовать большие области.

Однако у меня есть другие потребности в «движке рендеринга на основе пикселей в движке», поэтому меня все еще интересует некоторая точка зрения на это.

Любые идеи?

Редактировать: А как насчет SharpDX в этом контексте? Может быть, когда я начну, я мог бы также выбрать решение WinForms с оболочкой DirectX, такой как SharpDX (..или.. Я думаю, что я действительно должен сделать, это подписаться на всю энчиладу C++ , но, к сожалению, у меня нет времени, чтобы начать изучать это в гуще событий)..


person d7samurai    schedule 21.12.2013    source источник
comment
Ты жжешь. Просто хотел это сказать.   -  person Federico Berasategui    schedule 21.12.2013
comment
В конце концов, я вообще отказался от WPF и .Net и вместо этого выучил C++. Затем я начал с Direct2D из нативного кода, который поначалу казался нормальным. Затем я решил, что мне нужен еще больший контроль, поэтому я также отказался от Direct2D и накатил свой собственный 2D-фреймворк пользовательского интерфейса прямо поверх Direct3D 11. Теперь я достаточно близок к железу. Теперь я могу сделать гораздо больше — и это БЫСТРО. Создание собственного графического фреймворка с нуля позволяет мне проводить множество оптимизаций. Он менее гибкий и расширяющий, чем Direct2D, но работает лучше.   -  person d7samurai    schedule 22.04.2014


Ответы (1)


WriteableBitmapEx довольно быстр, даже когда он просто работает на ЦП. Он используется в этом высокопроизводительном элементе управления диаграммами: http://www.scichart.com.

Вы также должны проверить Direct3D. Вы можете получить действительно хорошую производительность, но это действительно зависит от того, как она используется, и от того, что большинство операций отрисовки кэшируются, а связь CPU-GPU максимально разрешена.

person Rene Schulte    schedule 22.12.2013
comment
Привет, Рене (помните это?). Да, WriteableBitmapEx довольно быстр - для многих вещей . Но я сделал быстрый тест сейчас, и у него есть некоторые недостатки для моих нужд. Я также протестировал Direct2D через оболочку SharpDX, и это очень быстро, особенно для перебрасывания больших растровых изображений. Похоже, я выбираю это, а это значит, что я могу вообще отказаться от WPF и поставить свою собственную систему компоновки прямо поверх DirectX... пока я не перейду на C++;) - person d7samurai; 23.12.2013
comment
Direct2D не такой быстрый. Только строки без сглаживания работают быстро. Я исследовал его для SciChart и быстро выбросил как слишком медленный. Рисование на C++ тоже не такое быстрое (мы попробовали Agg, движок для рисования на C++). По правде говоря, WBEx — один из самых быстрых способов рисования в Windows. Нам потребовалось почти 2 года исследований, чтобы превзойти его с помощью собственного механизма 2D-рисования DirectX10! scichart.com/how-fast-is-scichart-wpf-chart< /а> - person Dr. Andrew Burnett-Thompson; 22.02.2015
comment
@Dr.ABT, вы отображаете свой WriteableBitmap в элементе управления Image, или у вас есть лучший совет по отображению WriteableBitmap. И, может быть, вы могли бы дать несколько советов по поводу отображения больших изображений? Спасибо! - person WinterMute; 20.02.2019
comment
Привет @WinterMute да WriteableBitmap должен отображаться внутри элемента управления Image в свойстве Image.Source. Большие изображения? Возможно, вам понадобится плитка, так как в Windows существуют ограничения на максимальный размер растрового изображения. В моей компании SciChart мы также успешно интегрировали содержимое DirectX в элемент управления Image с помощью обратного чтения текстуры в WriteableBitmap. Это решение очень универсально для высокопроизводительной графики в WPF! - person Dr. Andrew Burnett-Thompson; 20.02.2019