.NET 白板書寫延遲-觸控式螢幕報點率

唐宋元明清2188發表於2024-10-10

觸控書寫延遲,是觸控式螢幕很核心的引數。從使用者在觸控式螢幕上進行觸控操作到裝置作出響應之間的時間差,這個延遲高低會影響快速反應的應用場景使用如白板書寫、玩遊戲。

而觸控延遲主要影響因素有:觸控框報點率、軟體框架延時(用於觸控資料接收、執行緒切換)、軟體業務邏輯處理

我們這裡介紹下觸控框報點率 Touch Report Rate,觸控式螢幕每秒報告觸控資料的次數(Hz),會根據裝置型別不同而變化

觸控操作TouchMove(StylusMove)是定時上報一次,一次會上報1-N個點。

1     private void MainWindow_OnStylusMove(object sender, StylusEventArgs e)
2     {
3         var currentPointsCount = e.GetStylusPoints(this).Count;
4     }

不同螢幕定時觸控上報時間不同,我們可以透過Stylus事件收集看看

 1     private void MainWindow_OnStylusDown(object sender, StylusDownEventArgs e)
 2     {
 3         _stylusDown = true;
 4         _startTick = Environment.TickCount;
 5         _stylusEntryCount++;
 6         _distinctPoints.AddRange(e.GetStylusPoints(this).Distinct());
 7     }
 8 
 9     private void MainWindow_OnStylusMove(object sender, StylusEventArgs e)
10     {
11         if (!_stylusDown)
12         {
13             return;
14         }
15         _stylusEntryCount++;
16         _distinctPoints.AddRange(e.GetStylusPoints(this).Distinct());
17     }

輸入平均間隔: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框架,而是在Windows 輸入管理器根據硬體配置限制為30幀,減少了傳遞給應用程式的事件數量

UI路由事件,我們看上面控制檯輸出,移動事件間隔30ms左右報個一次輸入事件,最後一個Move事件裡有4個點。這裡的4個點輸入,合併了1+2+1上面觸控執行緒事件的3次輸入,所以WPF路由事件管理也有觸控訊息的佇列,會合並觸控點

那有沒有可能減少觸控資料的合併,與觸控框保持一致的幀率呢?答案是有的,可以在WPF開啟如UWP的Point訊息:

1     public partial class App : Application
2     {
3         public App()
4         {
5             AppContext.SetSwitch("Switch.System.Windows.Input.Stylus.EnablePointerSupport", true);
6         }
7     }

新增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.

總之,瞭解觸控報點率,才能真正去把書寫效能以及書寫平滑這塊做好。

相關文章