Использование DirectX c ++ DLL в приложении C # WPF или Windows Forms - PullRequest
0 голосов
/ 19 февраля 2019

Я написал рендерер DX11, используя c ++.Я сейчас ищу способ реализовать редактор / графический интерфейс для него.

Так как я довольно привык к Windows Forms и приложениям WPF C #, я подумываю о том, чтобы поместить мой рендерер в dll, загрузите dll из приложения ac # и используйте его для рисования в определенном разделе формы.Работает ли это даже с дескриптором окна, передаваемым управляемым приложением c #, и какова производительность, если это так?

Насколько я понимаю, поскольку фактическая связь с API DX11 по-прежнему осуществлялась бы непосредственно на c ++, а часть c # сообщала бы dll, что для снижения производительности почти ничего не должно быть.Или это вообще плохая идея, и реализация GUI напрямую в c ++ с использованием библиотеки или D2D - лучший подход.

1 Ответ

0 голосов
/ 19 февраля 2019

В 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 вы просто не можете.

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