Десинхронизировать обновление окна Unity, встроенного в приложение WPF, с помощью HwndHost - PullRequest
0 голосов
/ 14 сентября 2018

Я работаю над приложением WPF, встраивающим приложение Win32 (окно Unity) благодаря HnwdHost.

По соображениям производительности мы обязаны установить частоту кадров окна единства равной 30 FPS. Однако, когда другие пользовательские элементы управления приложения WPF пытаются отобразить анимации, эти анимации не являются плавными (например, когда я пытаюсь быстро выделить несколько кнопок, выделение занимает некоторое время, чтобы следовать за мышью моего мыши). И если я установлю частоту кадров окна Unity на 500, у меня больше не будет никаких проблем.

Вот как я анализирую эту ситуацию: Во время анимации WPF GUI пытается обновить все элементы управления. Однако, поскольку частота кадров хоста Unity (HnwdHost) слишком мала, для обновления требуется большое время, и все остальные элементы управления, кажется, ждут этого.

Итак, знаете ли вы, есть ли способ десинхронизации рендеринга приложения WPF и рендеринга окна Unity (встроенный благодаря HwndHost)?

1 Ответ

0 голосов
/ 10 октября 2018

Аргумент parentHWND cmdline позволяет игроку Unity прикрепить свое окно с помощью SetParent , который присоединяет очереди сообщений двух потоков пользовательского интерфейса.Затем они отправляют блокирующие сообщения, что приводит к тому, что один процесс блокирует рендеринг другого.

Мы решили это, отсоединив очереди сообщений, используя AttachThreadInput .

// detach thread message queues so slow unity rendering won't block wpf rendering
var currentThreadId = GetWindowThreadProcessId(hwndParent.Handle, IntPtr.Zero);
var unityThreadId = GetWindowThreadProcessId(unityHWND, IntPtr.Zero);
AttachThreadInput(currentThreadId, unityThreadId, false);
AttachThreadInput(unityThreadId, currentThreadId, false);

Конечно, это означает, что необходимые сообщения окна должны быть отправлены вручную впоследствии.Однако при использовании WPF HwndHost изменение размера окна по-прежнему работает.

...