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

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

相关推荐
WangMing_X16 分钟前
C# 单个函数实现各进制数间转换
java·开发语言·算法·c#·winform·软件
天人合一peng22 分钟前
20201010 MTAP-3DGAM审稿意见
后端·3d·restful
计算机学姐1 小时前
基于SpringBoot的汽车票网上预订系统
java·vue.js·spring boot·后端·mysql·java-ee·mybatis
ou.cs1 小时前
c# 实现文件更新通知
c#
哎呦没1 小时前
农村扶贫管理:SpringBoot解决方案
java·spring boot·后端
△曉風殘月〆2 小时前
C#与C++结构体的交互
c++·c#·p/invoke
掘金一周3 小时前
不是吧,刚毕业几个月的前端,就写这么复杂的表格??| 掘金一周 10.31
人工智能·后端
TXRock3 小时前
从入门到放弃,我们为何从 Blazor 回到 Vue
c#·.net·recommendations
尘浮生3 小时前
Java项目实战II基于Spring Boot的火锅店管理系统设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·微信小程序·旅游
试行3 小时前
C#实现ClientWebSocket请求服务端,接收完所有返回值,解决接收数据不全
开发语言·c#