本文要点
- 添加 Hololens 设备支持,将为应用程序提供多种优点,其中包括更丰富的浸入式用户体验,以及吸引更多组的用户。
- 新构建 UWP 应用程序时,易于添加一些 HoloLens 特定的特性。但是在为添加 HoloLens 功能而升级已有的 UWP 应用程序中,其中存在一些现实的挑战。
- 只要已有的 UWP 应用程序(包括移动应用程序和桌面应用程序)中并没有使用一些 HoloLens 所不具备的、移动或桌面特定的 UWP 特性,这样的 UWP 应用完全可以直接运行在 HoloLens 上。否则需要替换相应的 API。
- HoloLens 开发对应用的部署、调试和环境提出了一系列挑战。
Microsoft HoloLens 是一种全息计算机,内置于头戴式混合现实智能眼镜中。它的支撑平台是 Windows 10,支持 UWP(通用 Windows 平台, Universal Windows Platform )应用程序体系结构。这意味着,只要 UWP 应用程序满足 HoloLens 系列设备所需的最低配置,就可以安装在 HoloLens 上。在构建新 UWP 应用程序的设计阶段中,可以考虑加入 HoloLens 的特定功能。但在为添加 HoloLens 功能而升级已有的 UWP 应用程序中,存在着一些现实的挑战。本文介绍了在开发新 UWP 应用程序时,以及为支持 HoloLens 而升级已有的 UWP 应用程序时,我们所得到的一些经验教训和面临的各种挑战。此外,我们提出,为支持 HoloLens 设备家族,应在开发周期的早期阶段就考虑 UWP 应用程序的设计事项。最后,我们给出了一些可行的解决方案和建议,意在简化升级过程。
为应用程序添加对 HoloLens 设备的支持,这将提供多个优点。首先,Microsoft HoloLens 使用三维全息图和空间映射,提供了身临其境的用户体验。大多数应用开发人员以移动设备和桌面设备为目标,这些应用程序使用二维框架呈现内容。如果应用程序的对象使用了三维模型呈现,例如在机器 CAD 模型和建筑体系结构设计中,那么用户可以更清楚地了解设计意图。其次,通过在支持设备中添加 HoloLens,开发人员可以将应用程序提供给更多的用户组。
HoloLens 的特性
简而言之,HoloLens 可以制作由光线和声音组成的全息图物体。它将无形的三维全息图投影到真实世界场景中。全息开始菜单(Holographic Shell)表示了一个“混合现实世界”(Mixed-Reality World),其中组合了真实世界中的物体和由系统创造的全息图。HoloLens 可以创建三维全息图,并置于真实世界物体中。全息图可以与用户进行交互。也可以加入到房间地板这样的水平平面上,以及房间墙壁这样的垂直平面上。例如,我们可以在墙上播放电影,或是安装一个 Web 浏览器,甚至是在空间漫步时随身携带一个 Skype 电话。我们可以使用全息图创建交互对象模型,进行概念验证(PoC,Proof of Concept)演示。HoloLens 通过自身的地理坐标识别房间模型,这有助于开发人员创建位置可感知的应用程序。运行于 HoloLens 上的应用程序可以利用空间映射和空间声音功能。下面列出了 HoloLens 的主要功能:
- HoloLens 在应用程序模型中使用 Holographic Shell、交互模型和感知 API。
- HoloLens 扫描周边环境。例如,扫描房间并创建房间的三维对象模型。
- HoloLens 使用模型(例如房间模型),并将全息图置于用户周边环境中。
- HoloLens 支持在真实世界物体和位置上固定或取消一个全息图,也支持对全息图做实时调整和缩放。
- 全息图可以响应用户的交互,例如眼动(Gaze)、手势和语音命令等。
- HoloLens 创建的全息图可以共享给其他的 HoloLens 用户。
- HoloLens 支持捕获混合世界的框架,并使用混合现实捕获(MRC,Mixed Reality Capture)功能,将其保存为图像或视频。
- 全息图可以显示在二维或三维框架中。
- HoloLens 可以将现实世界作为画布显示全息图。
- HoloLens 可根据应用程序的维度特性,将各个维度渲染为二维或三维的全息图,并呈现在混合世界中。
- HoloLens 通过清晰的全息投影、空间映射和空间声音,提供了一种身临其境的互动式用户体验。
虽然 HoloLens 打包了很多有用的功能,但是也存在着一些缺点,包括:
- HoloLens 的视角(viewport)只能展现为显示屏中央的一个小矩形框。用户必须记住全息图在房间中的放置位置。
- 尽管可以将已有的二维 UWP 应用部署在 HoloLens 上,但在应用程序的边界在二维窗口中非常受限。对于处理用户输入操作(例如手势等),不能提供良好的用户体验。
- 考虑到设备的成本及适用性,当前对小规模的 HoloLens 应用程序的更新并不会有利可图。
- 在已有应用程序中,难以手工识别并替换已经使用的、但尚未被 HoloLens 支持的 API 和功能。
更新一个已有的 UWP 应用程序
新的 UWP 为设备家族(Device Families)引入了设备分类。设备家族共享一组来自于操作系统核心功能的 API。对于每个运行在 Windows 10 操作系统上的设备, Microsoft 的 UWP 提供了一个通用应用程序平台及核心 API 层。虽然 Windows Runtime(WinRT) API 对所有的设备家族都是通用的,但设备家族并非一定要支持所有的 API。除 WinRT 以外,这些 API 应用所调用的 API,是特定于运行该应用的设备家族的。
已有的 UWP 应用程序主要面向手机和桌面,现在开发人员还希望能让它们运行在 HoloLens 上。由于这些移动和桌面应用程序在本质上是二维的,所以它们是在 HoloLens 的二维表面上渲染的。虽然使用 Unity 创建的应用程序看上去像是三维的,但它们也是在二维画布中渲染的。开发人员只要将 Package.appxmanifest 文件 Dependencies 部分的TargetDeviceFamily
声明为Name="Windows.Holographic"
,就能让已有的 UWP 应用程序安装在 HoloLens 上。
更新应用程序中的挑战
在 HoloLens 中,有一部分 Universal API 和特性尚未得到与桌面和移动设备上同等的支持。例如,在 HoloLens 中,Notifications、 File Explorer、Messaging 和 Tiles 等功能并不能完全起作用。Microsoft 在官方网站上发布了尚未支持的API 列表。其中也提到,一旦有API 在未来的SDK 版本得到支持,该列表将会更新。根据这些API 对开发和实施的影响性质,已有应用程序更新上的挑战可分为两大类。
1、实现 Universal API
大部分已有的 UWP 应用程序是针对移动和桌面开发的,其中可能使用了一些设备家族特定的功能。例如,在我们的一个已有UWP 项目中,Push Notifications 功能是针对移动设备家族实现的。由于该功能完全不被HoloLens 支持,因此我们不得不使用Windows.Networking API 作为一种变通的解决方案。
2、HoloLens 特定的挑战
全息图、空间映射和空间声音,它们都是 HoloLens 设备家族所特有的。在更新使用 Unity 创建的三维应用程序时,HoloLens 以真实世界作为画布,将所有的三维游戏对象渲染为全息图。直接在 HoloLens 中运行一个已有的三维应用程序,会给出很糟糕的用户体验。为使应用程序更逼真,需要加入空间映射和空间声音。为增添空间角色,需要在已有的游戏对象上做大量的工作。这时需要修改大部分已有的游戏对象,以在单个对象上添加空间映射和声音。除了模拟鼠标光标的眼动输入之外,还应在场景中添加手势和语音命令。如果我们在已有的应用程序中使用了自定义的手势,例如画圈手势、向左滑动删除、向右滑动确认等,我们就会发现在 HoloLens 上非常难以实现这些手势。尽管在 HoloLens 中打包了可扩展创建新手势的 Interaction Manager ,但是开发中会发现难以在三维帧中识别手的位置。我们正尝试使用 Microsoft 的 Galaxy Explorer project 提供的 HandInput 类去识别手的位置。开发人员还可以尝试使用 OpenCV 等第三方计算机视觉库实现。
问题分析
在一些论坛、博客和文章中,对在 HoloLens 上运行 UWP 应用程序的相关问题给出了广泛的讨论。在 HoloLens 设备和仿真器上运行已有的 UWP 应用程序时,我们遇到了一些困难和问题。鉴于这只是启始阶段,我们将问题提升为四个层次:
- 部署问题;
- 调试问题;
- 环境问题;
- 开发问题;
部署问题
对于模拟器而言,只要 Visual Studio 知道模拟器的 IP,很容易实现部署到模拟器。但是在部署到真实设备上时,由于设备提供的是外部地址,因此不能使用 Cortana 给出的 IP 地址。在设备设置中的“高级选项”可以给出内部地址。HoloLens 可以使用内部 IP 地址与 Visual Studio 2015 配对。如果 IP 地址映射不正确,那么调试控制台将给出如下的错误消息:
“DEP8000: Unexpected deployment failure: OperationFailedException: The network event being waited on triggered an error.”
部署中的错误
为便于更好地理解,下面列出了一些部署错误及可能的解决方法。
1. Failure reason: Failed to start deployment. Failure text: Install failed. Please contact your software vendor. (0x80073cf9)
导致此错误的原因很多,例如应用程序已安装在设备上、过时的 Windows SDK,或错误的 HoloLens 模拟器或应用程序体系结构。这时,为获取更多的错误信息,需要检查 AppXDeployment-Server 日志。查看 AppXDeployment-Server 日志的操作是:
- 点击开始菜单,选择“Programs”或“All Programs” → “Administrative Tools” → “Event Viewer”;
- 进而展开“Appications and Services Logs” → “Microsoft” → “Windows” → “AppXDeployment-Server” ,双击“Microsoft-Windows-AppXDeploymentServer/Operational”。
2. Failure reason: Failed to start deployment. Failure text: A Prerequisite for an install could not be satisfied. (0x80073cfd)
该问题意味着某些或所有依赖在设备上不可用。检查 Package.appxmanifest 文件中的最小构建版本号和目标构建版本号。要成功部署,必须满足所有的先决条件。
3. App manifest references the image 'images\Square71x71Logo.png' which does not have a candidate in main app package
UWP 设置“scale-200”为默认的图像比例因子。但 Visual Studio 使用仍然是更旧的规格,在默认情况下创建的是“scale-100”图像,而非“scale-200”图像。要解决这一问题,可以采用的方法包括:添加 scale-200 图像、在文件名中删除“.scale-100”,或将“Square142x142.png”文件(71x71 的两倍)添加到资产映射中等。在 Debug 模式下,并不会给出这个错误,只有在 Release 模式下构建应用程序时,才会给出该错误。
4. DEP6957: Failed to connect to device '192.168.xyz.abc' using Universal Authentication.
如果 HoloLens 设备未能正确地与 Visual Studio 配对,就会给出此错误。从 HoloLens 卸载应用程序,并重新安装,可能会解决该问题。
在控制台中显示的一些错误消息,没有给出具体的错误信息或描述。例如,如果应用程序已经安装在设备上,当我们试图使用 Device Portal Apps Manager 控制台在 HoloLens 仿真器或设备上部署应用程序,这时就会给出错误信息:“Please contact your software vendor
”。该错误信息并不能解释问题的原因。相反,错误信息“Application already installed
”更有意义。这样,我们可以通过在部署之前先删除应用程序,及时地解决问题。
下面列出了一些最常见部署问题的解决方案:
- 检查 AppxManifest 配置的变化情况;
- 更新 Visual Studio 项目属性;
- 检查 SDK 版本号;
- Debug 和 Release 配置的构建设置;
- 检查是否安装了全部依赖;
- 从设备或模拟器卸载并重装应用(或单侧加载,Sideloading);
- 所需配置的资产可用性(维度和分辨率)。
调试问题
该类别问题,与启用调试模式、将调试器附加到设备或仿真器、连接到设备入口、远程调试、托管 / 非托管 / 混合模式调试等问题相关,还包括与 Hyper-V 管理和以太网交换相关的所有问题。此类别问题还涵盖了与 NuGet 软件包管理器配置和设置相关的问题,即如何启用对缺失的软件包或依赖关系的自动下载。
我们曾遇到了下面的调试问题:
“The program '[4764] ModelExplorer.exe' has exited with code 255 (0xff)”
我们从该问题中得到的经验教训是:通过使用适当地调试版本设置,就可以避免此类问题:
- 选择“build debug/x86 for debugging”;
- 将“Application Process”设置为“ Mixed (Managed and Native)” 。
为避免出现调试问题,Microsoft 将或考虑实现如下建议:
- 对可解释问题给出确切错误描述;
- 对启用 Debug 模式的设置,提供更好的文档;
- 为连接到仿真器和设备提供正确的连接指南(通过 USB 或 Wi-Fi 进行远程调试);
- Dependency Manager(NuGet)配置更改。
环境问题
此类问题包括开发、调试、测试和系统环境相关的问题。大部分与 SDK 相关的问题,都可以通过正确地安装所需的 SDK(Windows 10 SDK、HoloLens Emulator、Visual Studio 2015 等)解决。如果没有正确地安装 HoloLens 仿真器软件,就无法在 Visual Studio 2015 的设备列表中看到,也就无法直接地运行构建。我们应该确保安装了正确的软件版本和更新补丁。例如,如果我们在 Windows 10 操作系统 1511 版本上安装了 Windows 10 SDK V10.0.143.93,那么则 Visual Studio XAML Editor 的设计模式将给出如图 1 所示的警告信息。这是因为该版本的 Windows 10 SDK 要求的最低操作系统版本为 1607。如果开发机中未运行 Windows 10 Anniversary Edition,那么我们可以使用另一种 XAML 编辑器,例如 XamlPadX 。XamlPadX 是一种基本的 XAML 可视化编辑器,可从 Microsoft Blog 下载。
图1 操作系统版本最低需求的警告信息
如果HoloLens 仿真器软件未正确安装,那么在访问仿真器设备入口时,或是通过Visual Studio 2015 在仿真器上直接部署应用程序时,将会出现问题。如果模拟器的网络适配器有问题,那么仿真器将给出图2 所示的警告。
图2 网卡问题给出的错误
(译者注:原文中,图1 和图2 位置错误。)
“更新SDK”和“安装正确版本的软件”,这两种措施很可能会解决与软件环境相关的问题。
开发问题
此类别涉及在应用程序开发或升级中遇到的所有问题。对于Visual Studio 所不支持的API 和功能,VS 并不显示编译中的错误和警告。因此开发人员必须谨慎实施一些替代解决方法,以确保不破坏所需的功能。例如,我们在已有的二维UWP 应用程序中添加自定义的手势Listener 中遇到了一些问题。问题是每当用户尝试启动滑动(Swipe)手势时,眼动点会落在二维框架之外,因此应用程序也就处于暂停模式。一旦发生这种情况,即便通过二维框架,应用程序也无法识别任何手势。对此问题, Dwight Goins 在 HoloLens 论坛给出了一个解答。Goins 是一名 TEALS 计算机科学讲师,也是 Microsoft 和 HoloLens 开发人员。他提出了两点建议:
- 创建一个三维应用程序扫描房间,然后切换回二维视图。这样我们就能识别手势,并生成双击事件去处理手势。
- 另一种可能做法是,创建一个非常大的二维窗口,并在窗口通过高亮或清晰突出一个小矩形区域去显示 UI 并识别点击,然后选择命令。
因为我们的应用程序要面对多个设备家族,因此我们遵循了第二个建议,为应用程序添加一个更大的窗口,只是为了用更少的工作量实现运行在 HoloLens 上。
在 HoloLens 中测试 UWP 应用程序
测试 HoloLens 应用程序类似于测试 Windows 应用程序。如果开发人员已具有测试 Windows 应用程序的经验,那么对 HoloLens 应用程序的测试完全不陌生。可以在仿真器上或真实设备上测试 HoloLens 应用程序。也可使用 Perception Simulation 软件库自动化测试,将模拟人类输入发送到应用程序中。还可以使用 IPerceptionSimulationManager API 模拟手势和眼动输入。此外,模拟器中可以模拟房间模型,因此也可以在模拟器中运行自动化测试。
加快应用面市
最大程度上缩短上市的时间,这在规划应用程序升级中是非常重要。下面给出一些已经我们确定的关键点,有助于读者升级已有的应用程序去支持 HoloLens:
- 配置升级:使用工具升级已有 UWP 应用程序的配置。此类工具通过编程去更新 Manifest 文件,实现修改已有的项目,增加对 HoloLens 设备家族的支持。例如,鉴于 Windows 10 应用程序不支持
AnyCPU
,工具可以删除<PropertyGroup>
元素,该元素是为“Debug | AnyCPU”或“Release | AnyCPU”构建而配置的。 - 兼容性测试工具:使用自动化测试工具识别那些 HoloLens 设备不支持、但是已有应用程序需要的软件库和 API。开发人员可以使用工具检查,已有应用程序使用的所有库是否与 HoloLens 兼容。工具输出的列表,仅包括那些在已有 UWP 应用程序中使用、但是并不被 HoloLens 支持的 API。
- API Wrapper 函数:对于 HoloLens 不支持的 API,应实现与设备家族无关的 Wrapper 函数。当开发人员想要自己去实现未受支持的 API 功能时,这些 API Wrapper 非常有用。
- 扩展 HoloToolkit: HoloToolkit 是 Microsoft 提供的一组预构建脚本和组件。有效使用 HoloToolkit ,肯定会缩短一些功能模块的开发时间,提高开发人员的生产力。使用额外的代码组件和可重用的依赖软件去扩展 HoloToolkit ,将加速全息应用程序的开发。
一些建议
在本文中,我们基于自身的经验教训,提出了一些建议,意在解决 HoloLens 应用程序开发中的挑战。这些建议将有助于开发人员缩短应用的上市时间,并提高应用的可用性。在开始应用程序开发之前,最好能确定并汇总各论坛中其他开发人员已经报告过的问题,这样可以将问题的搜索范围缩小到一些应用程序特定的功能上。根据应用程序的要求,列出在各类别和子类别下发现的问题。开发人员并不能完全依靠论坛贡献者去给出解决方案,这些解决方案是针对在线论坛和协作网站报告问题给出的。他们必须自己去分析和测试各个解决方案。
如果开发人员计划在已有 UWP 应用程序中添加对 HoloLens 设备的支持,那么他们必须标识所有在已有应用程序中使用的、但不被 HoloLens 支持的 API 和软件库。准备一份详细的文档,说明如何基于设备家族,实现对每个不受支持 API 的 Wrapper 函数。尽可能地使用 HoloLens 支持的 API 函数。一些功能,如语音命令的导航菜单项和动作按钮事件,也有助于改善应用程序在 HoloLens 上的用户体验。
结论
在规划新的应用程序开发时,所有的挑战已经被开发人员考虑到。另一方面,如果为添加对全息图支持而升级已有的应用程序,需要全面地分析应用程序的代码、过程流以及所使用的 API 和功能。最好能准备一个图表,比较不同设备家族(包括移动、桌面、HoloLens、IoT 和 Xbox 等)所支持的各种功能,这将有助于确定是否可能添加一些 HoloLens 特定的功能。
已有的 UWP 二维应用程序使用了移动设备和桌面电脑的软件和硬件功能。将 HoloLens 支持添加到应用程序时,完全有机会去利用附加的全息功能。一些已有的二维功能和 UI 设计模式可以自动更新,用上 HoloLens 功能。例如,升级应用程序时,可以自动创建和启用导航菜单项的语音命令。功能可以添加到 HoloToolkit 软件库中,也可以添加到单独的升级工具中。该工具可以根据开发人员的要求,将所有的附加功能注入到应用程序中。
Microsoft 已经发布了 Project Centennial ,该工具用于将已有的桌面应用程序转换到 UWP 上它可以扩展已转换的应用程序以添加对 HoloLens 的支持。我们可以用开发工具去检查 API 兼容性,这样可以缩短应用面市的时间,并为尚不支持的 API 提供回退机制。通过对尚未支持的 API 开发实现 Wrapper API,可为开发人员提供一种结构化的方式,以根据开发人员的需求实现功能。
本文作者简介
Vinothkumar Arputharaj 是 Technology Focus 小组的高级技术主管,该小组属于 HCL Technologies 有限公司工程和研发服务组技术办公室。他于 2009 年在印度 Coimbatore 的 Bharathiyar 大学获得计算机应用硕士学位。
评论