我可以减少WPF应用程序中手写笔/触摸输入的开销吗?

Ror*_*ory 6 .net c# wpf performance touch

我开始意识到使用触摸屏(生成触控笔和触摸事件而不仅仅是鼠标事件)似乎会在WPF应用程序中的UI线程上造成巨大的开销.如果我将足够的手指放在屏幕上,应用程序上,并在某些机器上移动它们,即使是简单的应用程序也可以停止.它看起来很奇特,面对它,大部分都在我无法控制之下.使用分析器显示主要在StylusLogic/InputManager代码(Windows.Input)和Dispatcher.GetMessage例程中花费了大量时间.

我无法找到任何"最佳实践"这种事情,我可以得到的最接近的解决方案是完全禁用触摸支持(MSDN:禁用RealTimeStylus)并自己挂钩到WM_TOUCH消息,生成我自己的PreviewTouchDown/PreviewMouseDown事件(在这里描述的"另一种WPF唯一方式":CodeProject:WPF和多点触摸)但这有时并非没有自己的问题,并没有让我成为一个长期明智的解决方案.我也尝试将事件标记为早期处理,以防止它们发生隧道/冒泡; 我将每个PreviewStylusMove事件(最常见的事件)标记为在主窗口视图中作为实验处理,这似乎没有提供巨大的收益.虽然上面的codeproject链接指出WPF中存在(或者是)多点触控的错误,但我发现即使是在功能较弱的PC上进行单触操作也比我的开发人员设置(使用我工作的一些实际商业软件)延迟和延迟一次几秒钟,您仍然可以使用任务管理器/分析器观察不寻常的工作量,通过单点触摸观察CPU性能.

我可以做任何事情来减少这些事件的频率(EG PreviewStylusMove)吗?我有其他选择还是一切都不受我的控制?

显然,我可以努力提高应用程序的效率,但是手写笔/触控似乎是一个很大的初始性能,因此知道我可以采取哪些措施来缓解这一点.

完全披露:这是一个.NET 4.5应用程序.我在不同型号/品牌的触摸屏上尝试了这一点,没有明显的差异.我的计算机和应用程序的设置期望按下并保持行为与按住鼠标左键相同,而不是生成右键单击事件.我在Windows 7和Windows 8.1机器上都进行了测试,没有任何区别.

下面的例子是我用来测试它的简单应用程序.当我在应用程序窗口上放置10个手指时,它会暂时停止或在我使用过的某些计算机上跳过帧(其他计算机可能太快而无法显示延迟,但是可以在任务管理器中观察到负载增加):

<Window x:Class="SimpleApplication.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:SimpleApplication"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Rectangle Fill="Aqua" Width="150" Height="150" RenderTransformOrigin="0.5, 0.5">
        <Rectangle.RenderTransform>
            <RotateTransform />
        </Rectangle.RenderTransform>
        <Rectangle.Triggers>
            <EventTrigger RoutedEvent="Loaded">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetProperty="(Rectangle.RenderTransform).(RotateTransform.Angle)"
                                         To="-360"
                                         Duration="0:0:2"
                                         RepeatBehavior="Forever" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Rectangle.Triggers>
    </Rectangle>
</Grid>
Run Code Online (Sandbox Code Playgroud)

使用i7-2600 3.4GHz处理器不会落后于我的机器,但它确实落后于我的机器上配备Core 2 Duo 2.93GHz处理器.

小智 2

WPF 团队在 4.6 和 4.6.1 中进行了一些触摸修复。(我是 WPF 团队的软件工程师)

完成这项工作的工程师在读完这个问题后说: * 是的,4.6.1 应该对此有很大帮助。* 他们还应该确保大量处理是在触摸事件本身之外完成的,因为这会占用主线程。

4.6.1 候选版本于 2015 年 10 月发布。

谢谢,罗布·瑞莱亚

http://twitter.com/rrlyea