0

由于 HnwdHost,我正在开发嵌入 Win32 应用程序(Unity 窗口)的 WPF 应用程序。

出于性能原因,我们不得不将统一窗口的帧率设置为 30 FPS。但是,当 WPF 应用程序的其他用户控件尝试显示动画时,这些动画并不流畅(例如,当我尝试快速突出显示几个按钮时,突出显示需要时间跟随鼠标的光标)。如果我将 Unity 窗口的帧率设置为 500,我就没有任何问题了。

这就是我分析这种情况的方式:在动画期间,WPF GUI 似乎尝试刷新其所有控件。但是,由于 Unity 主机 (HnwdHost) 的帧速率较慢,刷新需要很长时间,并且所有其他控件似乎都在等待它。

那么,您知道是否有一种方法可以使 WPF 应用程序的渲染和 Unity 窗口的渲染(由于 HwndHost 嵌入)不同步?

4

1 回答 1

1

parentHWND cmdline 参数允许统一播放器使用SetParent附加其窗口,它附加两个 UI 线程的消息队列。然后他们发送阻塞消息,这导致一个进程阻塞另一个进程的渲染。

我们通过使用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 时,窗口大小调整仍然有效。

于 2018-10-10T15:51:33.243 回答