将嵌入在 WPF 应用程序中的 Unity 窗口的刷新与 HwndHost 不同步



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

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

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

那么,您是否知道是否有办法使 WPF 应用程序的渲染与 Unity 窗口的呈现(由于 HwndHost 而嵌入(的呈现不同步?

parentHWND cmdline 参数允许 unity 播放器使用 SetParent 附加其窗口,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 时,窗口大小调整仍然有效。

最新更新