@Rays
2017-12-17T10:28:07.000000Z
字数 9281
阅读 2490
语言开发
摘要: 本文作者了介绍在HoloLens应用开发中得到的一些经验教训。这些经验部分来自于开发使用HoloLens的新UWP应用程序,部分来自于升级已有应用程序支持HoloLens。作者给出了为支持HoloLens设备家族,在UWP应用设计上的一些考虑,这些考虑需要加入到应用开发周期的早期阶段。本文最后,作者给出了一些简化应用升级过程的可行解决方案和建议。
审校: Sergio De Simone
正文:
本文要点
添加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可以制作由光线和声音组成的全息图物体。它将无形的三维全息图投影到真实世界场景中。全息开始菜单(Holographic Shell)表示了一个“混合现实世界”(Mixed-Reality World),其中组合了真实世界中的物体和由系统创造的全息图。HoloLens可以创建三维全息图,并置于真实世界物体中。全息图可以与用户进行交互。也可以加入到房间地板这样的水平平面上,以及房间墙壁这样的垂直平面上。例如,我们可以在墙上播放电影,或是安装一个Web浏览器,甚至是在空间漫步时随身携带一个Skype电话。我们可以使用全息图创建交互对象模型,进行概念验证(PoC,Proof of Concept)演示。HoloLens通过自身的地理坐标识别房间模型,这有助于开发人员创建位置可感知的应用程序。运行于HoloLens上的应用程序可以利用空间映射和空间声音功能。下面列出了HoloLens的主要功能:
虽然HoloLens打包了很多有用的功能,但是也存在着一些缺点,包括:
HoloLens的视角(viewport)只能展现为显示屏中央的一个小矩形框。用户必须记住全息图在房间中的放置位置。
尽管可以将已有的二维UWP应用部署在HoloLens上,但在应用程序的边界在二维窗口中非常受限。对于处理用户输入操作(例如手势等),不能提供良好的用户体验。
考虑到设备的成本及适用性,当前对小规模的HoloLens应用程序的更新并不会有利可图。
在已有应用程序中,难以手工识别并替换已经使用的、但尚未被HoloLens支持的API和功能。
新的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对开发和实施的影响性质,已有应用程序更新上的挑战可分为两大类。
大部分已有的UWP应用程序是针对移动和桌面开发的,其中可能使用了一些设备家族特定的功能。例如,在我们的一个已有UWP项目中,Push Notifications功能是针对移动设备家族实现的。由于该功能完全不被HoloLens支持,因此我们不得不使用Windows.Networking API作为一种变通的解决方案。
全息图、空间映射和空间声音,它们都是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日志的操作是:
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
”更有意义。这样,我们可以通过在部署之前先删除应用程序,及时地解决问题。
下面列出了一些最常见部署问题的解决方案:
该类别问题,与启用调试模式、将调试器附加到设备或仿真器、连接到设备入口、远程调试、托管/非托管/混合模式调试等问题相关,还包括与Hyper-V管理和以太网交换相关的所有问题。此类别问题还涵盖了与NuGet软件包管理器配置和设置相关的问题,即如何启用对缺失的软件包或依赖关系的自动下载。
我们曾遇到了下面的调试问题:
“The program '[4764] ModelExplorer.exe' has exited with code 255 (0xff)”
我们从该问题中得到的经验教训是:通过使用适当地调试版本设置,就可以避免此类问题:
为避免出现调试问题,Microsoft将或考虑实现如下建议:
此类问题包括开发、调试、测试和系统环境相关的问题。大部分与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应用程序类似于测试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大学获得计算机应用硕士学位。