WPF 解决白板书写延迟:提高触摸屏报点率

前言

触摸书写延迟,是触摸屏很核心的参数。从用户在触摸屏上进行触控操作到设备作出响应之间的时间差,这个延迟高低会影响快速反应的应用场景使用如白板书写、玩游戏。

正文

而触摸延迟主要影响因素有:触摸框报点率、软件框架延时(用于触摸数据接收、线程切换)、软件业务逻辑处理

我们这里介绍下触摸框报点率 Touch Report Rate,触摸屏每秒报告触控数据的次数(Hz),会根据设备类型不同而变化

触摸操作TouchMove(StylusMove)是定时上报一次,一次会上报1-N个点。

c# 复制代码
private void MainWindow_OnStylusMove(object sender, StylusEventArgs e)
{
    var currentPointsCount = e.GetStylusPoints(this).Count;
}

不同屏幕定时触摸上报时间不同,我们可以通过Stylus事件收集看看

c# 复制代码
private void MainWindow_OnStylusDown(object sender, StylusDownEventArgs e)
{
    _stylusDown = true;
    _startTick = Environment.TickCount;
    _stylusEntryCount++;
    _distinctPoints.AddRange(e.GetStylusPoints(this).Distinct());
}

private void MainWindow_OnStylusMove(object sender, StylusEventArgs e)
{
    if (!_stylusDown)
    {
        return;
    }
    _stylusEntryCount++;
    _distinctPoints.AddRange(e.GetStylusPoints(this).Distinct());
}

输入平均间隔:var stylusEntryTime = (Environment.TickCount - _startTick) / (double)_stylusEntryCount

Dell触摸屏

我日常用于开发联调触摸相关功能的触摸屏,戴尔触摸屏Dell-P2418HT 1080P的触摸数据:

1、WPF应用StylusMove输入,拿到的间隔是33ms,即30帧

2、一次输入包含1-7个点

3、再算个点平均间隔16.7ms -- 这个数据也是有意义的,可以用于评估类似书写预测1个点可以提升的性能

使用BusHold,我们看下真实点输入间隔:

BusHold第4列数据,01是指Down/Move事件,00是指Up操作结束。我们看到Move操作输入间隔基本在16-17ms,说明触摸框真实报点间隔17ms左右,即60帧。

上面WPF监听Stylus事件,拿到的触摸操作输入间隔是33ms。为何应用层拿到的触摸数据帧率比触摸框低呢?

我们试试StylusPlugin(StylusPlugin方案可以提前拿到触摸数据,可以用于触摸书写加速方案,提升)拿触摸线程的触摸数据,以及WPF路由触摸事件数据对比下:

与BusHold同样是7个点,

触摸线程事件,只不过2个点合并到一次触摸输入事件里了。所以这2个点合并操作不是路由事件内处理的,也不是WPF框架,而是在WPF 输入管理器根据硬件配置限制为30帧,减少了传递给应用程序的事件数量

UI路由事件,我们看上面控制台输出,移动事件间隔30ms左右报个一次输入事件,最后一个Move事件里有4个点。这里的4个点输入,合并了1+2+1上面触摸线程事件的3次输入,所以WPF路由事件管理也有触摸消息的队列,会合并触摸点

那有没有可能减少触摸数据的合并,与触摸框保持一致的帧率呢?答案是有的,可以在WPF开启如UWP的Point消息:

c# 复制代码
public partial class App : Application
{
    public App()
    {
        AppContext.SetSwitch("Switch.System.Windows.Input.Stylus.EnablePointerSupport", true);
    }
}

添加EnablePointerSupport后,我们监听TouchMove事件:

触摸移动事件触发间隔就减少到16-17ms了,到与触摸框报点率相同帧率,good!

开启Pointer更多内容作可以看德熙MVP的博客 WPF dotnet core 如何开启 Pointer 消息的支持 (lindexi.com),但开启Pointer也有很多坑WPF 开启Pointer消息存在的坑 (lindexi.com),大家谨慎使用

触摸大屏

再看看目前市面上交互触摸大屏所使用的富创通、华欣主流触摸框产品路由触摸数据:

输入间隔为15.6ms左右,触摸点之间平均间隔为7ms左右,即触摸框报点140帧以上,应用层触摸数据60帧。

最近有一款改良的富创通触摸G框版本,我们也由应用端收集下数据:

输入间隔没变也是15.6ms左右,触摸点之间平均间隔为4.5ms,即触摸框报点220帧左右,应用层触摸数据依然是60帧。说明这款触摸框提升了本身的报点率,但应用层根据硬件条件限制了60帧触摸报点。

这里触摸数据帧数限制,与屏幕刷新率有关,一般屏幕刷新率是60Hz.

总之,了解触摸报点率,才能真正去把书写性能以及书写平滑这块做好。

总结

本文介绍了如何优化白板的书写延迟问题,通过提高触摸屏的报点率来改善用户体验。通过具体的实现方法和技术细节,可以了解到有效的解决方案,从而提升白板应用的流畅性和响应速度。

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!

作者:唐宋元明清2188

出处:cnblogs.com/kybs0/p/18453947

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!

相关推荐
Asthenia041224 分钟前
Spring扩展点与工具类获取容器Bean-基于ApplicationContextAware实现非IOC容器中调用IOC的Bean
后端
bobz96542 分钟前
ovs patch port 对比 veth pair
后端
Asthenia04121 小时前
Java受检异常与非受检异常分析
后端
uhakadotcom1 小时前
快速开始使用 n8n
后端·面试·github
JavaGuide1 小时前
公司来的新人用字符串存储日期,被组长怒怼了...
后端·mysql
bobz9651 小时前
qemu 网络使用基础
后端
Asthenia04122 小时前
面试攻略:如何应对 Spring 启动流程的层层追问
后端
Asthenia04122 小时前
Spring 启动流程:比喻表达
后端
Asthenia04122 小时前
Spring 启动流程分析-含时序图
后端
ONE_Gua2 小时前
chromium魔改——CDP(Chrome DevTools Protocol)检测01
前端·后端·爬虫