我正在研究一些通过触摸交互并通过OpenGL渲染的应用程序(可能在ANGLE之上,因此是DirectX)。理想情况下,我希望接近瞬时的触摸响应,这被证明是非常具有挑战性的。我已经实现了一系列不同时间的触摸拖动界面(首先在WebGL中使用标准OpenGL和GLEW然后在Python中使用Visual C ++和ANGLE在正常的WinRT应用程序(没有XAML)),但我永远不会接近匹配Windows开始屏幕上滚动的响应性。
进行一些研究后,似乎开始屏幕正在使用DirectManipulation库。显然,它的作用是接管触摸输入的控制,然后图形变换在一个单独的线程中处理,并使用窗口合成器本身而不是应用程序进行渲染。我通过下载DirectManipulation样本验证了这一点,他们确实展示了与开始屏幕相同的令人印象深刻的响应能力。
我进行了一些测试,我在慢动作中记录了一次触摸,然后在DirectManipulation示例和我的ANGLE实现中拖动,你可以看到在我的手指在DirectManipulation样本中移动大约70ms并且大约在130ms之后我的手指在ANGLE实施中移动(这是最快的)。
在我看来,这可能是由于屏幕在屏幕上合成而触摸输入延迟和额外缓冲/ blitting引起的。 ANGLE实现似乎使用了最佳实践,在交换链中使用Flip Mode Present,以原始分辨率全屏显示,并且我运行了一个令人难以置信的基本应用程序(基本上是一个用手指移动的方块)。这将指向缓慢的触摸事件传递。我使用标准的WM_POINTER事件,并且我已经禁用了窗口上的触摸反馈,所以我对如何从中挤出更多响应能力感到有点失落。
DirectManipulation正在做什么才能实现触摸事件的低延迟响应时间?这是我可以从用户空间访问的内容,还是由合成器中的高优先级调度导致的响应?