В WPF вы можете использовать D3DImage , который похож на простое изображение в вашем xaml.Общий принцип таков:
- Выделите текстуру Direct3D 9, это будет ваша цель рендеринга.
- Передайте ее D3DImage.SetBackBuffer.
Поместите код рендеринга в обработчик событий CompositionTarget.Rendering.
RenderStuffToTexture();
d3dImage.Lock();
d3dImage.AddDirtyRect(new Int32Rect()
{
X = 0,
Y = 0,
Height = d3dImage.PixelHeight,
Width = d3dImage.PixelWidth
});
d3dImage.Unlock();
Поскольку вы используете Direct3D 11, вы должны использовать DXGI для совместного использования поверхности , чтобыподелитесь текстом D3D9 с D3D11.Я знаю 2 примера, которые иллюстрируют, как это сделать.Microsoft D3D11Image и D3DImageEx (мои личные предпочтения можно найти в нескольких местах в Интернете).
Что касается производительности, если вы используете WPF, вы больше не делаете презентацию самостоятельно.Вы буквально пишете небольшую логику рендеринга в текстуру внутри рендерера на основе WPF D3D9.Так что не все можно контролировать, включая время презентации.Исходя из моего личного опыта, вы можете определенно воспроизводить простые сцены с хорошей частотой кадров.Для действительно графически насыщенного приложения и строгих требований FPS я бы использовал более легкое (и менее навязчивое) решение для пользовательского интерфейса.
Обратите внимание, что вы также можете использовать элемент управления WinformHost для получения HWND и рендеринга в него.Это имеет серьезный недостаток, если вы хотите наложить элементы управления пользовательского интерфейса на визуализированный кадр - AFAIK вы просто не можете.