65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows 应用程序的触摸响应测量、分析和优化

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2014年5月28日

CPOL

17分钟阅读

viewsIcon

20086

本文介绍了两个应用程序,它们展示了触摸响应时间差或无响应以及高能耗等问题,这两者都对应用程序性能和用户体验至关重要。然后,我们将讨论如何优化这些应用程序以解决这些问题。

引言

用户体验 (UX) 是当今产品的制胜法宝。虽然其他功能在设备的功能性中也很重要,但任何功能都无法弥补感知到或实际存在的响应和易用性方面的不足。自 Windows 8 推出以来,触摸手势已成为与基于 Windows 的超极本™ 设备、平板电脑和手机进行交互的主要方式。这些系统的实用性部分取决于触摸如何改善用户体验 (UX),进而取决于触摸界面的速度和响应能力对 UX 质量的影响。

触摸响应时间是从用户开始移动手指执行触摸手势到应用程序提供用户期望的手势视觉更新的那一刻之间的延迟。触摸响应以非常小的采样时间 (100-500 毫秒范围) 进行测量。识别和优化性能较差的触摸响应区域对于实现最佳用户体验至关重要。

对于 Windows 应用程序而言,触摸功能实现是一个全新的领域——从测量到分析和优化。一个不总是正确的假设是,如果一个应用程序一直在更新场景,它就能快速响应用户的触摸手势。本文讨论了测量触摸响应的方法、在 Intel® 架构 (IA) 上进行触摸优化的分析方法,以及理解与触摸响应相关的问题所需的工具组合。

除了触摸响应时间,计算机资源利用率和电池寿命是影响用户体验的非常重要的因素。本文介绍了两个应用程序,它们展示了触摸响应时间差或无响应以及高能耗等问题,这两者都对应用程序性能和用户体验至关重要。然后,我们将讨论如何优化这些应用程序以解决这些问题。

为什么实现良好的触摸用户体验很重要?

超极本设备和平板电脑在市场上的普及率不断增长,触摸是提供良好用户体验 (UX) 的基本支柱之一。如今,触摸屏设备无处不在,从手机、平板电脑、超极本到一体机 (AIO)——它们是将机箱集成到显示器背面的台式电脑。IT 研究公司 Gartner 预计,到 2015 年,购买给 15 岁以下用户的 PC 中,将有超过 50% 配备触摸屏 [1]。

通过 Windows 8,微软建立了 Windows 应用商店,它充当一个中心化的触摸驱动枢纽,供开发人员发布应用程序,供消费者购买。如果应用程序对用户的触摸手势有明显的延迟,该应用程序可能会获得差评,这无疑会影响其销量。

图 1. 软件在触摸堆栈中的作用

图 1 显示了软件和驱动程序在触摸响应能力中的关键作用,其中 5 层中有 3 层属于软件堆栈(占约 60%)。糟糕的触摸响应能力通常是软件堆栈中的问题。

触摸处理

Windows 桌面应用程序有三种方式支持触摸输入和手势。要全面了解这些触摸 API 的用法,请阅读“关于消息和消息队列”[7]。WM_GESTUREWM_TOUCH 消息都向后兼容 Windows 7,而 WM_POINTER 消息则不兼容。每种消息都有优缺点。WM_POINTER 最易于实现,但控制力最弱。WM_TOUCH 需要的代码最多,但允许非常精细地控制,而 WM_GESTURE 则处于中间状态。Windows 应用商店应用程序支持触摸的许多方法都可以使用,从处理触摸输入和操作的 GestureRecognizer 类到使用 Windows 8.1 中引入的 DirectManipulation API。

优化触摸带来的节能红利

能源是提供卓越用户体验的另一个重要支柱。应用程序的可用性受其消耗的能量以及它对电池寿命的影响。如果应用程序迅速耗尽能量,用户将不愿意运行它。高能耗通常源于对系统资源的重度使用,即 CPU、GPU 甚至存储设备执行不必要的工作。下面的案例研究展示了这些问题,并强调了在优化触摸处理功能时通常会看到的次要效果,即应用程序的能耗降低。这种降低能耗的次要效果就是我们所说的“节能红利”。

用于触摸分析的 Windows 工具

许多工具可用于帮助您优化基于 Windows 的触摸应用程序。理解每种工具的测量和分析用途对于查明与触摸相关的问题至关重要。以下是对工具的简要描述、它们 intended 的用途以及与触摸分析特定方面的相关性。

  1. 测量工具
    1. 使用高分辨率相机测量响应时间
      1. 录制触摸交互的视频,逐帧手动回放以获得响应时间。
    2. Windows PerfMon
      1. 预装在 Windows 中,用于查看 CPU 和其他系统统计信息。
      2. 此工具以一秒为粒度收集数据,并提供应用程序运行时系统行为的概述。
    3. Intel® Power Gadget
      1. 收集功耗/能耗指标,例如封装(CPU 和 GPU)功耗。
    4. Windows Performance Recorder (WPR)
      1. 随 Windows 8/8.1 ADK 一起提供。
      2. WPR 具有用户界面 (WPRUI),允许执行跟踪以收集特定的系统指标,例如 CPU 利用率、虚拟内存提交、功耗等。
    5. FRAPS
      1. 报告应用程序的渲染速率 (FPS),仅适用于桌面应用程序。
      2. 尽管网站声称它仅支持到 Windows 7,但您可以在 Windows 8/8.1 桌面应用程序上使用它。
  2. 分析工具
    1. Windows Performance Analyzer (WPA)
      1. 随 Windows 8/8.1 ADK 一起提供。
      2. WPA 用于加载 WPR 生成的 .etl 文件,以便进行深入分析。
    2. Intel® VTune™ Amplifier XE 2013
      1. 允许开发人员了解哪些函数/模块最耗时。
      2. 提供线程调度的详细视图。
    3. Intel® Performance Bottleneck Analyzer (PBA)
      1. 提供响应能力优化的高级分析功能。
    4. GPUView
      1. 随 Windows 8/8.1 ADK 一起提供,并深入了解 CPU 上下文队列和 GPU 硬件队列之间发生的情况。收集此信息时,请使用 WPRUI 跟踪选项“GPU 活动”。
    5. Intel® Graphics Performance Analyzer (Intel® GPA)
      1. 提供有关系统图形活动的信息,包括帧速率。
  3. 使用这些工具时需要问的问题
    1. Intel Power Gadget 报告的封装(CPU 和 GPU)功耗是否远大于基线?
    2. Windows Performance Analyzer 是否显示 CPU 使用率很高?
      • 场景是否有任何视觉更新?
      • 如果 CPU 使用率出现峰值,屏幕上发生了什么?也许每三秒发生一次的动画会导致 CPU 使用率每三秒增加一次。
    3. GPUView 是否显示 CPU/GPU 队列已满?
    4. Intel Performance Bottleneck Analyzer 在时间线视图中显示什么?
      • 按消耗 CPU 时间最多的模块进行筛选,并查看正在发生的模块/线程活动。
    5. 应用程序是否将系统计时器滴答分辨率从 15.6 ms (Windows 默认) 更改为更小的值?
      • 如果应用程序将系统计时器滴答分辨率更改为更小的值,例如 1 ms,应用程序将过于频繁地执行 Update 和 Draw 调用,这可能会导致 CPU 上下文队列和/或 GPU 队列堆积。

现在,让我们看看这些工具是如何用于优化两个应用程序并回答上述一些问题的。

案例研究

对于这些特定的案例研究,我们使用高分辨率相机方法获得了约 200 ms 的平均响应时间。在这些情况下,应用程序不仅触摸响应缓慢,而且经常完全无法响应触摸手势。

一款具有糟糕触摸响应的休闲多人多点触控游戏应用程序

1. 问题陈述

这款 Windows 桌面应用程序的延迟约为 170 毫秒。但更糟糕的是,该应用程序经常根本没有响应(手势没有视觉更新)。由于这是一款体育游戏,这些触摸响应问题经常会导致不公平的计分。

2. 使用工具识别问题

我们使用的第一个工具是 Windows Perfmon,因为它收集的数据提供了应用程序运行时系统上发生情况的概述。查看应用程序在未执行触摸手势时的资源利用率,可以了解在发生触摸时导致大部分瓶颈的原因。我们可以在这里看到,CPU 使用率、上下文切换率、中断率等资源是否已经达到最大值(100% 利用率)或超过了根据先前工作负载分析获得阈值。

图 2. 应用程序空闲时,CPU 使用率达到 100%

图 2 显示单个 CPU 核心(处理器 0)被 100% 时间占用,这意味着这个单核应用程序在更新视觉上不变的场景时受 CPU 限制。

下一个工具 Intel Power Gadget 用于了解应用程序始终占用单个 CPU 核心 100% 所带来的影响。我们以管理员身份运行命令提示符,导航到安装目录,然后输入

PowerLog3.0.exe –duration <duration to run for in seconds> –file <log_file.csv>

运行命令后,我们键入 log_file.csv 的名称并按 Enter。图 3 显示了应用程序运行时和未处理触摸交互时系统的封装(CPU 和 GPU)功耗。x 轴是读取能量 MSR 的采样率,y 轴是处理器的功率(瓦特)[3]。

图 3. 应用程序空闲时封装(CPU 和 GPU)功耗(瓦特)

当执行触摸手势时,即使在有无触摸交互时功耗几乎相同的情况下,也发生了与 CPU 使用率图表中相同的行为。这清楚地表明有某些东西消耗了所有资源,使得触摸难以响应。应用程序未运行时系统的功耗约为 2.5 W,这意味着应用程序导致功耗增加了 9 W。是什么导致了这 9 W 的 CPU 和 GPU 功耗增加?

接下来,使用 Intel GPA,在应用程序不处理触摸手势时报告的渲染速率约为每秒 350 帧 (FPS),而在执行触摸手势时约为每秒 210 帧。虽然这是一个持续的争论点,但普遍的共识是,人眼通常无法区分一个以 60 FPS 渲染的应用程序和一个以 120 FPS 渲染的应用程序之间的差异。这意味着用户在屏幕上看到的视觉更新将与应用程序以 60 FPS 渲染时相同。

接下来,使用 GPUView,它显示了高渲染速率导致 GPU 队列已满,因为应用程序正试图尽快将作业提交给 GPU 流水线。图 4 显示了带有双哈希标记的包行,这表示一个已准备好显示在屏幕上的 present 数据包。这种活动发生在应用程序显示一个没有视觉更新的屏幕时。

图 4. GPUView 工具生成的已满 GPU/CPU 队列的屏幕截图

是什么导致 CPU 使用率为 100% 且 CPU/GPU 队列堆积?

接下来使用 WPRUI,仅选择了 CPU 使用率跟踪选项以减少工具造成的开销。在收集空闲场景数据时,请考虑工具本身造成的开销量。此时,我们知道该应用程序正在导致 CPU/GPU 队列堆积,那么在图形模块之前调用了什么?通过检查应用程序到图形模块的调用堆栈,我们找到了一些关于导致这种不必要工作的调用的线索。

图 5. 应用程序的热调用堆栈

检查图 5 中的调用堆栈,发现在调用 D3D9 Present 调用之前不久调用了一个 Game::Tick 方法,该方法最终导致了图形模块 igdumd32.dll。这个 Game::Tick 方法无意中将系统的计时器滴答分辨率从 15.6 ms(Windows 默认)更改为 1 ms。参见图 6。

图 6. Game Tick 方法更改系统计时器分辨率

因此,每 1 毫秒,应用程序就会执行 Update 和 Draw 调用,因为这是 Game::Tick 被调用的时间。每毫秒调用这些方法还意味着 CPU 经常唤醒,不会进入更深的睡眠状态 (C-states),并且 GPU 的忙碌程度超过了必要。

3. 最终结果

提供了 API 来确保应用程序不会更改系统的计时器滴答分辨率,并且应用程序已与 Vsync 同步。在使用这些类型的 API 后,CPU 不再将 100% 的执行时间花在 Update 和 Draw 调用上。

图 7. 优化后的应用程序 CPU 使用率

由于 CPU 不再每毫秒执行不必要的 Update 计算和 Draw 调用,CPU 上下文队列和 GPU 队列不再堆积。图 8 中的屏幕截图显示,由于显示器的刷新率为 60 Hz,因此以 60 FPS 提交工作。

图 8. 优化后的应用程序 CPU 和 GPU 队列活动

现在,应用程序的渲染速率被限制在 60 FPS,因为在具有 60 Hz 刷新率的显示器上,每个 Vsync 都会提交一个 present 数据包。通过优化应用程序在空闲场景(屏幕无视觉变化且未处理触摸手势)下的资源消耗,触摸响应更快、更流畅。优化后应用程序的平均触摸响应时间约为 110 毫秒,而之前平均约为 170 毫秒,并且不再丢失触摸(应用程序无响应)。

作为一项额外的好处(节能红利),该系统的封装功耗降低了约 8.5 W。现在用户可以在他们喜欢的 Windows 移动设备上更长时间地玩该应用程序,而无需充电。

总之,空闲应用程序的行为可能导致应用程序淹没触摸处理管道。通过优化版本,应用程序拥有更多的余量来处理额外的触摸手势,从而降低了触摸延迟。

一款丢失触摸响应的 3D 休闲游戏应用程序

1. 问题陈述

本案例研究是一款 Windows 8 桌面上的 3D 自由奔跑游戏,它使用 WM_TOUCH 消息来处理触摸输入。要玩游戏,用户需要在不同方向上滑动屏幕,使角色执行不同的动作(例如跳跃、滑动、蹲伏等)。如果不执行触摸手势,角色将继续向前固定路径奔跑。

在游戏的原始版本中,当执行两种类型的触摸交互时,角色不会执行预期的动作,而是继续向前奔跑。

  1. 当连续执行两次滑动时,如果它们之间的时间间隔太短,第二次滑动通常没有响应。
  2. 当在触摸屏上滑动的距离太短时,该滑动通常没有响应。

2. 使用工具识别问题

  1. 隔离问题。 确定触摸响应问题是由于应用程序还是平台(硬件/驱动程序/操作系统)引起的。推荐的方法是运行 WPR,切换到应用程序,并在数据收集期间在特定时间执行单个触摸手势,以便在分析期间直观地显示触摸事件及其持续时间。

    图 9. 标记有响应的触摸和无响应的触摸


    手动记录有响应和无响应的触摸事件。通过一个跟踪触摸注册的过程,我们能够通过检查消息处理函数的调用堆栈来标记操作系统何时注册了触摸,如图 9 所示(紫色尖峰)。

  2. 比较良好用户体验与糟糕用户体验的调用堆栈。 比较具有响应能力的触摸(良好用户体验)与无响应能力的触摸(糟糕用户体验)的各个方面,通常会显示应用程序调用的函数存在差异。

    对包含 FrameMove() 的调用堆栈进行了调查,因为该函数顾名思义,会提供视觉更新。在“良好用户体验”的调用堆栈中调用了 AvatarMovesToTheLeft::FrameMove 函数,而在“糟糕用户体验”中则未调用(参见图 10)。

    图 10. 有响应的触摸与无响应的触摸的调用堆栈

  3. 跟踪调用堆栈。通过跟踪“糟糕用户体验”调用堆栈,我们发现了调用链中断的位置。调用了 Windows 消息处理函数,包括 PeekMessageDispatchMessage,甚至游戏的 WndProc 函数。这证实了所有触摸输入都已由应用程序的消息处理函数接收,但未调用设置预期动画的角色奔跑模式的 xxxSlideLeftStatexxxSlideRightState 函数(参见图 11)。

图 11. 糟糕用户体验消息处理调用堆栈

3. 最终结果

  1. 快速连续滑动丢失的原因是,只有当角色的奔跑模式处于“向前奔跑”状态时,滑动手势才会对游戏起作用。如果它处于其他状态,触摸输入将被丢弃。例如,在第一次滑动手势之后,奔跑模式的状态从“向前奔跑”更改为“向右滑动”。如果第二次滑动在状态恢复到“向前奔跑”之前快速到来,它将被丢弃。通过缓存适当奔跑模式的触摸消息,该问题得到了修复。
  2. 短滑动丢失的原因与游戏的 WndProc 函数有关。该游戏仅在滑动距离大于 60 个逻辑像素时才识别滑动手势,这就是为什么一些短滑动会丢失的原因。在相同的分辨率下,60 个逻辑像素在超极本屏幕上的物理距离比在 iPhone* 屏幕上的物理距离更长。这使得从 iPhone 平台移植到超极本的游戏的短滑动在超极本屏幕上更容易丢失。解决方案是将滑动距离的阈值设置基于屏幕上的物理距离(使用每英寸点数 DPI),而不是逻辑像素。

总之,我们通过比较 Windows 消息 API 调用来确定操作系统是否以及在何处注册了触摸,从而将问题隔离为应用程序或平台相关的问题。然后,比较具有预期响应的手势(良好用户体验)和无响应的手势(糟糕用户体验)的调用堆栈,以找出调用的函数之间的差异。最后,我们追踪了丢失触摸的手势的游戏消息处理调用堆栈的上游,以查找调用链中断的位置。调用堆栈跟踪的起点是“良好用户体验”调用堆栈中调用但“糟糕用户体验”调用堆栈中未调用的函数。

结论

优化触摸至关重要,并且有许多可用的测量和分析工具。请记住,要有一个参考点(基线),您可以将其与应用程序运行时收集的数据进行比较。查看应用程序仅运行时获得的数据与执行触摸手势时获得的数据之间的差异。比较应用程序响应触摸时的行为与不响应触摸时的行为。

“如果一个应用程序一直在更新场景,它就能快速响应用户的触摸手势”这个假设并不总是正确的。场景只应在必要时更新,以节省系统资源,这些资源可用于在发生触摸手势时快速响应。通常,为不重要的动画而无谓地更新场景会导致 Windows 消息、CPU 或 GPU 队列堆积,这可能随后导致向用户触摸提供视觉响应的延迟。

参考文献

[1] Fiering, Leslie. Gartner Says More Than 50 Percent of PCs Purchased for Users Under the Age of 15 Will Have Touchscreens by 2015. Gartner, 7 Apr. 2010. Web. 03 Mar. 2014.

[2] Chabukswar, Rajshree, Mike Chynoweth, and Erik Niemeyer. Intel® Performance Bottleneck Analyzer. Intel Corporation, 4 Aug. 2011. Web. 12 Feb. 2014.

[3] Seung-Woo Kim, Joseph Jin-Sung Lee, Vardhan Dugar, Jun De Vega. Intel® Power Gadget. Intel Corporation, 7 Jan. 2014. Web. 25 March 2014.

[4] Freeman, Jeffrey M. "Intel® Graphics Performance Analyzers (Intel® GPA) FAQ." Intel Corporation, 17 Dec. 2013. Web. 25 Mar. 2014.

[5] H, Victor. "iPhones Score Highest Touch Responsiveness, More than Twice as Responsive as Android and Windows Phone Devices." Phone Arena. Phonearena, 01 Oct. 2013. Web. 26 Mar. 2014.

[6] "Windows Assessment and Deployment Kit (Windows ADK)." Microsoft Corporation, 2 April. 2014. Web. 3 April. 2014.

[7] "About Messages and Message Queues." Microsoft Corporation, 24 Jan. 2012. Web. 26 Mar. 2014.

[8] Intel® VTune Amplifier XE 2014. Intel Corporation, 6 Mar. 2014. Web. 3 April 2014.

[9] Fraps 3.5.99. Fraps, 26 Feb. 2013. Web. 3 April. 2014.p>

相关内容

如何创建可用的触摸UI
如何调整触摸控件

© . All rights reserved.