Sumerics案例研究
Florian Rappl,德国雷根斯堡大学一名 28 岁的博士生,凭借其开发的 Sumerics 应用赢得了 Windows* 8 & Ultrabook™ 应用创新大赛。Sumerics 应用能够对 Ultrabook™ 设备传感器数据进行复杂分析,并将结果以极具视觉吸引力的 2D 和 3D 图形呈现。
引言
Florian Rappl,德国雷根斯堡大学一名 28 岁的博士生,凭借其开发的 Sumerics 应用赢得了 Windows* 8 & Ultrabook™ 应用创新大赛。Sumerics 应用能够对 Ultrabook™ 设备传感器数据进行复杂分析,并将结果以极具视觉吸引力的 2D 和 3D 图形呈现。Sumerics 使用现有框架和语言(特别是 Windows* Presentation Foundation (WPF) 和 C#)构建,充分利用了运行 Microsoft Windows 8 的 Ultrabook 设备上的传感器和触摸屏功能。Rappl 选择使用成熟的 WPF 来渲染用户界面,同时他依赖于相对较新的开源库 MahApps.Metro 来赋予 Sumerics 用户界面现代、触屏友好的外观和感觉。
Sumerics 可在 Intel AppUp® 中心 下载。
关于 Sumerics 应用
Rappl 设计 Sumerics 的初衷有两个:首先,他希望为可视化复杂数据系列提供一个直观的触摸式用户界面,这些数据系列可以从各种静态文件(如 CSV)或 Ultrabook 设备传感器的实时动态数据中收集。其次,他希望用户能够轻松地将这些数据系列直接作为计算分析的输入。为了实现这种分析,Rappl 将所有传感器公开为用于显示和分析数据的函数,这一设计决策允许用户收集有关 Ultrabook 设备传感器当前状态的信息以供进一步探索。Rappl 表示,任何处理数据可视化的人都可以从该应用中受益。例如,Sumerics 可用于声学物理的高级课程中,通过使用 Sumerics 的快速傅里叶变换算法来分析通过 Ultrabook 设备麦克风说出的词语,使用户能够获得特定说话者在特定词语频率上的可视化表示。
通过使用 Ultrabook 设备键盘、连接的鼠标或其他外设,Sumerics 用户可以像使用 MATLAB*(一种用于数值计算、可视化和编程的高级语言和交互式环境)一样输入和编辑数据。然而,由于一切都设计为触摸操作,Sumerics 显示的图形可以使用屏幕触摸命令进行旋转、平移、缩放、保存和打印。通过这种方式,Sumerics 利用了 Ultrabook 设备的功能和灵活性。Rappl 表示,Ultrabook 设备提供了平板电脑的便携性与笔记本电脑的高性能和运行标准软件能力的绝佳组合。
挑战
创建 Sumerics 时面临的挑战
在创建 Sumerics 的过程中,Rappl 面临四个主要挑战。
- 决定是开发 Windows 应用商店应用还是在 Windows 8 桌面版中运行的应用
- 决定是使用 HTML5 还是 WPF 来构建应用
- 妥善规划触摸和传感器实现
- 构建数学解析器并决定使用哪些绘图库
以下各节将描述 Rappl 如何应对这些挑战。
导航 Windows 8
Windows 8 为最终用户提供了选择。他们可以在桌面模式下导航 Ultrabook 设备,这类似于导航运行早期 Windows 版本的 PC 和笔记本电脑。或者,他们可以切换到几个平面、横向滚动的磁贴中的一个,使用智能手机和平板电脑用户熟悉的现代、面向触摸的用户界面。因此,开发人员必须决定最终用户将如何访问他们的应用。
Rappl 选择为 Windows 8 桌面版构建 Sumerics,主要是因为他已经有构建 Windows 桌面应用的经验,特别是使用 C# 和 WPF UI 框架,该框架已存在多年。因此,有许多开源库可用,包括那些可以轻松构建触摸式 UI 的库。
Rappl 发现的一个缺点是,目前用 C# 和 WPF 为桌面 UI 编写的代码无法提交到 Windows 应用商店。Windows 应用商店中的应用通常使用 JavaScript* 编写,UI 构建围绕 HTML5 和 CSS3。Rappl 表示,如果他想确保 Sumerics 在 Windows 应用商店分发,他会采用这种方法。(目前,它可以在 Intel AppUp® 中心获得)。Rappl 指出,可以使用 WinRT 组件库为基于 C# 的应用编写 JavaScript 包装器,然后通过 Windows 应用商店分发。然而,在创建 Sumerics 的时候,Rappl 表示此方法存在 bug,实际上所有使用 C#/VB/C++ 和 XAML 构建的 Windows 应用商店应用,部分原因在于难以利用 WPF 的绑定能力。
Rappl 使用现有工具和技术,构建了一个支持触摸的应用,该应用充分利用了 Ultrabook 设备传感器,并在运行 Windows 8 的 Ultrabook 设备上流畅运行,为 Sumerics 在桌面模式下提供了用户访问和导航。鉴于 Windows 桌面悠久而成熟的传统,Sumerics 有一个触达潜在庞大受众的渠道。
HTML5 与 WPF
对于 Rappl 来说,导航 Windows 8 的关键部分是决定是使用 HTML5 还是 WPF 来构建应用。他得出结论,HTML5 无疑拥有光明的前景,他预计它最终将成为构建平台无关应用的实际标准。然而,由于他已经精通 WPF,他围绕该图形子系统构建了用户界面,该子系统可用于构建引人注目的、支持触摸和传感器的 Windows 8 桌面应用。Rappl 表示,WPF 引入了设备无关像素,与使用时间更长、自 Microsoft .NET Framework 早期以来就已使用的 Windows Forms 相比,这是一个显著的优势。他赞扬了 WPF 的数据绑定功能,该功能还充分利用了附加属性和依赖属性的概念。
然而,WPF 也有其挑战。例如,与 Windows Forms 一样,控件可能很重。但由于所有内容(图像除外)都是矢量图,可以通过 DirectX* 运行,因此 UI 可以得到加速,从而最大程度地减少了这个问题。控件还可以完全自定义,开发人员可以充分利用区分逻辑树和视觉树的能力。此外,WPF 中的 3D 功能提供了适度的生产力提升。
至于 HTML5(与 CSS3 和 JavaScript 结合使用),Rappl 认为该标记语言很可能在面向跨平台触摸屏的未来(这一点可以说已经到来)中发挥核心作用。但问题仍然存在。例如,他表示,令人沮丧的是,虽然 HTML5 和 C# 都是跨平台的,但两者的组合却不是。尝试使用 C# 到 JavaScript 的源代码到源代码编译器来规避此限制可能会令人困惑。任何转向 JavaScript(一种动态语言)的举动都意味着牺牲与 C#(一种静态语言)相关的速度和响应能力。因此,对于想要为挑剔的用户提供最大程度响应的应用的 Rappl 来说,C# 配合 WPF 是最佳选择。
妥善规划触摸和传感器实现
Sumerics 是 Rappl 开发的第一个触摸屏应用。Rappl 的三个主要收获:第一,为了方便使用,将每个按钮的大小至少设置为 40x40 像素,使其足够大,清晰可见且易于按下或点击。第二,使用工具提示(将鼠标光标悬停在元素上时启用的弹出文本)作为辅助功能;始终努力确保程序的使用不需阅读文本即可显而易见。第三,确保即使没有键盘也可以访问应用的主要功能,这是为平板电脑和智能手机设计时一个足够简单的规则,但在构建支持触摸的应用时,特别是要在 Ultrabook 设备上的 Windows 8 桌面访问的应用时,这一点更难做到。
Rappl 表示,处理传感器最终是他整体开发工作中的次要部分。这是因为 Sumerics 的主要重点是可视化可以来自任何来源的数据系列,无论是导入的 CSV 文件还是板载加速度计。事实上,即使 Sumerics 只用于可视化从静态文件导入的数据系列,它的效果也很好。此外,由于使用 Windows 传感器和位置平台 将传感器数据公开为函数相对直接,因此 Rappl 能够将大部分时间花在如何最好地渲染引人注目的图形和图表上。
构建数学解析器并决定使用哪些绘图库
Sumerics 的核心是 Yet Another Math Parser (YAMP*),它可以将一串字符转换为数学表达式。当 Rappl 在 CodeProject 上看到 Windows* 8 & Ultrabook™ 应用创新大赛广告时,他决定同时构建 Sumerics 应用和一个数学解析器,他希望后者能利用 C# 的特性。通过将 YAMP 代码发布到开源社区,Rappl 在代码审查过程中获得了他们的专业知识,这是开源世界的核心。
以下是 Sumerics 架构的概览,其中绿色表示第三方库,橙色表示 YAMP 外部库,蓝色表示与 Sumerics 相关的新库。
Sumerics 明显严重依赖 YAMP,YAMP 需要特定格式的命令。例如,如果 YAMP 用户想清除某些变量,他或她必须输入以下命令
clear("a", "b", "c")
在 Sumerics 中,命令更简单
clear a b c
这是因为 Sumerics 也有一个命令解析器。Rappl 添加了该解析器,以尽可能方便最终用户调用 YAMP 函数。如果命令解析器找到一个有效命令,Sumerics 将执行它。否则,整个表达式将被传递给 YAMP,然后 YAMP 会解析和解释该表达式。
Rappl 表示编写命令解析器很容易,只需要一个抽象基类。下面是一个代码片段,展示了他如何使用反射来注册 Sumerics 命令解析器可以使用的方法。
public static void RegisterCommands() { var lib = Assembly.GetExecutingAssembly(); var types = lib.GetTypes(); foreach (var type in types) { if (type.IsAbstract) continue; if (type.IsSubclassOf(typeof(YCommand))) { var cmd = type.GetConstructor(Type.EmptyTypes).Invoke(null) as YCommand; commands.Add(cmd.Name.ToLower(), cmd); } } }
下面显示了使命令解析器中的某些函数可用的类的一个小子集。
命令解析器处理任意数量的参数。基本代码与 Rappl 在其关于 CodeProject 上 YAMP 的文章中描述的类似。
要编写 YAMP 插件中的特定传感器函数,Rappl 首先从一个抽象基类开始,然后将其扩展到各种传感器。Rappl 实现 acc()
函数的方法如下:
using System;
using Windows.Devices.Sensors;
namespace YAMP.Sensors
{
[Description("Provides access to the acceleration sensor of an Intel UltraBook™.")]
[Kind("Sensor")]
public class AccFunction : SensorFunction
{
static Accelerometer sensor;
static AccFunction()
{
try
{
sensor = Accelerometer.GetDefault();
}
catch { }
}
protected override void InstallReadingChangedHandler()
{
if(sensor != null)
sensor.ReadingChanged += OnReadingChanged;
}
protected override void UninstallReadingChangedHandler()
{
if (sensor != null)
sensor.ReadingChanged -= OnReadingChanged;
}
void OnReadingChanged(Accelerometer sender, AccelerometerReadingChangedEventArgs args)
{
RaiseReadingChanged(args.Reading);
}
/// <summary>
/// retrieves acceleration in (X,Y,Z)-direction in units of g
/// </summary>
/// <returns></returns>
[Description("Retrieves acceleration in (X, Y, Z)-direction in units of g. Hence usually (no movement) the returned vector will be (0, 0, 1).")]
[ExampleAttribute("acc()", "Returns a 3x1 matrix of accelerations in the x, y and z directions.")]
public MatrixValue Function()
{
return new MatrixValue(Acceleration);
}
public static double[] Acceleration
{
get
{
if (sensor == null)
return new double[3];
var acc = sensor.GetCurrentReading();
return new double[] { acc.AccelerationX, acc.AccelerationY, acc.AccelerationZ };
}
}
}
}
请注意,Rappl 提供了许多静态函数,这使得 Sumerics 可以直接访问(用于传感器的实时数据),而无需创建显式实例或让 YAMP 解释固定表达式。传感器读数 AccelerometerReading 包含在一个嵌套类中。如果没有传感器数据,将返回 null 值,尽管 YAMP 始终返回数据 — 具体来说是具有正确维度的标量和矩阵,但没有值(因此每个值都为 0)。
由于 Sumerics 专注于数据可视化,因此选择合适的 2D 和 3D 图形显示库至关重要。最终的决定是在两个开源库之间做出:IronPlot 和 OxyPlot。IronPlot 能够渲染 3D 图形,为 IronPython 提供了一个合适的绘图包(无需使用 Mathplotlib,否则将增加对 Python 的依赖以及 C# 和 Python 之间的通信依赖)。OxyPlot 是一个平台无关的绘图包,包括 WPF 实现。根据 Rappl 的说法,OxyPlot 文档齐全,可扩展性强,并包含许多出色的功能,包括注释和跟踪图的功能。
对于 3D 绘图,Rappl 创建了自己的库,尽管该库是围绕 OxyPlot 构建的。该库不仅能够渲染数据系列的矩形、线条等,还能渲染完整的图像。这种渲染带来了明显的性能提升,并使得能够绘制热力图和其他复杂的图形,这些图形在当今各种 Ultrabook 设备屏幕上显示效果很好。(一些 Ultrabook 设备的分辨率高达 1600x900。)
有用的资源
Rappl 阅读了 Intel 关于使用 Ultrabook 设备传感器的文章,包括 http://software.intel.com/en-us/articles/ultrabook-touch-and-sensor-resources 上的文章。他还查阅了支持触摸的应用(不仅仅是支持触摸的应用)的规范,并咨询了外部资源,包括 CodeProject 上的资源。此外,Rappl 还依赖 Intel AppUp® 开发者认证工具来创建简单的 MSI 安装文件。Rappl 在 CodeProject 上发表的一篇文章详细介绍了他在 Sumerics 上的工作:https://codeproject.org.cn/Articles/472698/Sumerics。Rappl 还在其 YouTube* 频道上发布了多段他使用 Sumerics 的短视频,包括一段展示如何绘制从 Ultrabook 设备倾角计、陀螺仪和指南针捕获的数据的视频:http://www.youtube.com/user/FlorianRappl。
需要考虑的事项
Rappl 认为 HTML5 是触摸屏 UI 的未来,并且凭借他创建 Sumerics 所获得的经验,他表示如果他重新开始,他可能会使用 HTML5 而不是 WPF,特别是如果他想在 Windows 应用商店分发他的应用的话。
结论
Sumerics 从静态文件导入数据或从 Ultrabook 的许多板载传感器收集数据,并生成易于通过触摸屏操作的引人注目的 2D 和 3D 图形。这种高级数据可视化可能在各种环境中证明是有用的,从成熟公司的工程测试实验室到高中物理教室。(在一个关于经典力学的基本课程中,学生可以进行一项实验,让 Ultrabook 从一座相当高的建筑物上掉落,然后使用 Sumerics 查看加速度计的数据,以确定设备是否达到了失重状态。)尽管 Ultrabook 设备硬件和 Windows 8 操作系统相对较新,Rappl 在几个月内就构建了获奖应用,并在其他承诺之余,主要使用成熟的语言和框架(C# 和 WPF)以及免费提供的库。
Rappl 总结道,运行 Windows 8 的 Ultrabook 设备代表了一类相对较新的设备,其特点是结合了触摸屏平板电脑的便携性和易用性以及功能齐全的笔记本电脑的强大功能。但他构建一款令人印象深刻的应用的经验,该应用与行业领先的 MATLAB 产品相媲美,这表明精通微软成熟技术(特别是 C# 和 WPF)的开发人员可以在保持在熟悉的微软桌面环境(尽管现在是触摸启用的)的同时,构建一款令人印象深刻的触摸屏应用,该应用充分利用了 Ultrabook 设备的众多功能,包括其各种传感器。
关于 Florian Rappl
表面上看,Florian Rappl 的主要重点是撰写他的论文——一个重要的工作标题是“量子色动力学的费曼图采样”——这个领域是理论粒子物理学。然而,他在计算领域的活跃程度远远超出了大多数物理学研究生。目前,他教授 C# 编程以及使用 HTML5、CSS3 和 JavaScript 设计 Web 应用的研究生课程。他参与了雷根斯堡大学的几个高性能计算项目,其中一个项目试图使用 Intel® Many Integrated Core Architecture 芯片构建一台超级计算机。他是 CodeProject 的 MVP,CodeProject 是网络上一个非常活跃的开发者社区。事实证明,赢得Windows* 8 & Ultrabook™ 应用创新大赛只是 Rappl 一系列成就中的最新一项,尽管除了赞誉之外,这项成就还为他带来了超过 30,000 美元的奖金以及一台新的 Ultrabook 设备。
本文档部分内容经许可使用,版权归 CodeProject 所有,2012 年。Intel 不对第三方供应商及其设备的质量、可靠性、功能或兼容性作任何陈述或保证。有关优化信息,请参阅 software.Intel.com/en-us/articles/optimization-notice/。所有产品、日期和计划均基于当前预期,并可能随时更改,恕不另行通知。Intel、Intel 徽标、Intel AppUp、Intel Atom、Intel Inside 徽标、 以及 Ultrabook 是 Intel Corporation 在美国和/或其他国家的商标。 *其他名称和品牌可能被声称为他人的财产。 版权所有 © 2013。Intel Corporation。保留所有权利。