Используйте WPF в сочетании с аппаратным рендерингом вместо RenderTargetBitmap - PullRequest
4 голосов
/ 09 августа 2010

У созданного мною WPF-приложения есть Viewport3D, связывающий все виды объектов UIElement3D.Теперь я хочу сохранить снимок высокого разрешения определенного вида в файл.Я пробовал RenderTargetBitmap в прошлом, но мне не нравится этот подход из-за следующих недостатков:

  • Утечка памяти (по крайней мере, в .NET 3.5 SP1).Это должно быть решено, однако, с 4.0, но я еще не проверял это.
  • Программный рендеринг не дает таких же результатов, как аппаратный рендеринг при использовании сглаживания и пиксельных шейдеров.
  • RenderTargetBitmap needsмного времени (например, 10 секунд) для формирования изображения, а не доли секунды, необходимой для отображения на экране.

Поэтому мне интересно, можно ли будет использовать VisualBrush, содержащийскопируйте снимок в новом элементе управления / окне (желательно вне экрана), а затем извлеките содержимое через передний или задний буфер с использованием методов DirectX или GDI.Я мог предположить, что разрешение вне возможностей графической карты могло бы быть проблемой, но это могло быть решено, захватывая многократные вспомогательные изображения и соединяя их вместе назад.Так кто-нибудь с некоторыми идеями на эту тему?

Помните, что я читал о DirectX, XNA, SlimDX, GDI +, BitBlt и т. Д., Но это все, что я имею в этой области.Целевая платформа - Windows XP +.Если решение возможно, но не на XP, я хотел бы знать также.

С наилучшими пожеланиями,

Ян ван де Пол

1 Ответ

1 голос
/ 30 марта 2011

Это сложная проблема, поскольку WPF хранит так много своих внутренних функций при себе, но мой друг, Джеремия Моррилл, нашел способ задействовать основную поверхность DirectX, которую WPF использует при рендеринге окна. Я использовал его для проекта, который звучит так, как будто к нему предъявляются очень похожие требования, и он работал прекрасно (и намного быстрее, чем любой из «запрещенных» методов, предоставляемых WPF).

Возможно, вам придется ознакомиться с немного большим количеством DirectX (не слишком, обещаю!), Но вы можете прочитать об этом и скачать рабочий исходный код из его блога здесь:

http://jmorrill.hjtcentral.com/Home/tabid/428/EntryId/438/How-to-get-access-to-WPF-s-internal-Direct3D-guts.aspx

...