2017-10-17 29 views
0

我有一个使用WPF UI的3D渲染应用程序。渲染本身是用本地代码完成的,但交互来自WPF。WPF鼠标事件更新性能

现在,我已经看到WPF的鼠标事件以非常不规则的间隔被触发,并且在某些情况下,我从来没有得到任何事件。这似乎与应用程序使用的CPU数量有关。

通过使用低级别的Win32 GetCursorPos和类似的方法,我可以得到更好的响应,但是这与WPF UI元素交互混淆。

有没有办法控制WPF消息处理循环的优先级,或通过其他方式确保我得到我需要的鼠标事件?

另外,我可以做一个低级别的鼠标处理程序使用Win32调用,以某种方式将事件注入WPF?

+2

您需要多少鼠标事件?我怀疑真正的问题是,你试图在UI线程中每帧计算太多其他东西,而不是利用延迟处理 – MickyD

+0

渲染器以每秒60帧的速度运行,但如果我得到10-20个鼠标事件,我很幸运每秒。这意味着即使渲染器运行平稳,使用鼠标平移视图也会看起来不稳定。我有充足的周期来备用每一帧,这似乎是WPF事件处理程序饿死了。 – tseval

+0

WPF和Windows是应用程序消息队列中鼠标消息的最终来源,它不仅能够提供每秒超过60条消息的鼠标更新。我真的怀疑你在渲染器中获得60 FPS,如果平移看起来不稳定**,无论你获得什么样的鼠标更新。同样,很明显,您每帧执行的计算量过多,或者您的绘图代码效率低下。 – MickyD

回答

0

我最终从本地渲染层刷新了窗口消息队列,每帧一次。基本上我打电话以下本地代码每帧一次,渲染之前:

MSG msg; 
    while(PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

这解决了我的问题,因为我现在得到的所有先前扔下鼠标事件。