本文只聊原理部分

各个硬件都是独立的

假定是需要做触摸屏的笔迹,那么触摸屏和屏幕是独立的硬件,而处理数据的主机又是独立的硬件

独立的硬件意味着可以并行执行,因此最佳方式就是隐藏时间,即极限优化能做到是速度最慢的硬件的频率

例如有三个硬件,如触摸框 和 屏幕 和 PC 主机

从触摸框收到触摸消息,从 PC 进行处理告诉屏幕如何绘制,在屏幕进行绘制

简单分为三个硬件,此时假定触摸框收到触摸点到将点传到 PC 用的时间是 30 毫秒。在 PC 收到触摸消息到应用程序处理完成等通过 HDMI 输出到显卡需要的时间是 15 毫秒。在显示器屏幕收到 HDMI 输出到屏幕刷新需要的时间是 16 毫秒

那么此时极限优化的笔迹延时就是三个硬件中速度最慢的触摸框硬件,也就是 30 毫秒以上

这就是高性能笔迹的核心了

在 Windows 下 dx 无敌

在 Windows 下,如果是极渣的设备,无显卡垃圾 CPU 的,那么此时 GDI+ 的性能最强

如果存在显卡,或者 CPU 不够渣,那么此时的 dx 是无敌的

如果存在显卡,同时 CPU 很强,那么此时的 DX 和 OpenGL 的性能接近。如果此时是 Intel 的 CPU 那么基本可以认为是 DX 的性能更强

在 Windows 8 之后,可以使用 DirectComposition 技术,这个技术是 DX 图层合成技术,可以最大化压榨设备的性能。因此如果能使用 win10 那么总体渲染性能更强

默认在 WPF 下使用的是 DX 作为渲染引擎,因此纯渲染性能上,使用 DX 一系的框架都是渲染最优的。如果不选 WPF 那么应该选其他 DX 体系下的框架,如 UWP 等

在 Win10 下,采用 UWP 能使用 DirectComposition 技术,应用本身自己能使用,这和 WPF 不相同。在 win10 下,框架层的 WPF 没有使用 DirectComposition 技术,但可以在框架层之上混合使用。如果在框架层上使用,请看 WPF 使用 Composition API 做高性能渲染

因此 Win10 下的 UWP 能做到最快的笔迹,在 Win10 下,一个空应用加上一个空 InkCanvas 就能做到 Win10 极限笔迹速度

渲染几何图形最吃显卡

本质上笔迹的渲染就是 几何图形 的渲染,笔迹就是使用 Geometry 几何图形的渲染,对比基础图形和图片的渲染,在 2D 下渲染几何图形是最吃显卡的

因此有显卡和没有显卡使用 CPU 计算的性能差很大。但如果能在指定时间内完成计算任务,那么再强的设备的性能差也不大

在 CPU 最小调度单位是线程

因此如果一个线程做业务,同时也处理笔迹数据处理,那么笔迹处理的性能一定没有独占一个线程高

同时线程是被调度的,如果笔迹所在的线程没有被调度上,那么此时的优化是没有意义的。因此不要让笔迹线程的优先级太低

在 WPF 中 UI 线程主线程和渲染线程是两个不同的线程。而触摸线程也是一个独立的线程。可以再开启一个笔迹线程作为一个独立线程。但不要再开一个渲染线程,因为渲染多线程不好玩

这里说的渲染线程指的是从上层 UI 线程拿到了绘制数据,在渲染线程将绘制数据转绘制命令发送到 DX 进行渲染。因此让渲染多个线程意义不大

让笔迹成为独立 UI 线程方法请看 WPF 跨线程 UI 的方法

实时触摸的速度比从 USB 获取快

在 Windows 下有一个叫 RealTimeStylus 技术,从这里获取触摸的速度会比从 USB 读取快

在 WPF 中如何使用 RealTimeStylus 请看 WPF 高速书写 StylusPlugIn 原理

在 WinForms 中请看 WinForms 下的高性能笔迹方法


本文会经常更新,请阅读原文: https://dotnet-campus.github.io//post/%E9%AB%98%E6%80%A7%E8%83%BD%E7%AC%94%E8%BF%B9%E5%8E%9F%E7%90%86.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 lindexi (包含链接: https://dotnet-campus.github.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系