HoloLens开发手记 - 构建2D应用 Building 2D apps

时间:2021-09-10 19:16:24

HoloLens可以让我们在真实世界中看到全息图像内容。但是它本质上还是一台Windows 10设备,这意味着HoloLens可以以2D应用形式运行Windows Store里的大部分UWP应用。

目标平台设为Windows.Universal Targeting Windows.Universal


微软过去几年平台一直在变革,所以开发者往往会有不同的起点,所以下面会给出一些指南,来帮助不同起点的开发者顺利的迁移代码带UWP平台上。

不同的起点 Starting Points

这几年大家接触的Windows平台会有很多,下面分别提供针对他们的指引。

起点

AppX Manifest清单目标平台

如何迁移到UWP?
Windows Phone (Silverlight) Silverlight App Manifest清单 Migrate to WinRT
Windows Phone 8.1 Universal 不包含目标平台的8.1 AppX Manifest清单 Migrate your app to the Universal Windows Platform
Windows Store 8 不包含目标平台的8 AppX Manifest清单 Migrate your app to the Universal Windows Platform
Windows Store 8.1 Universal 不包含目标平台的8.1 AppX Manifest清单 Migrate your app to the Universal Windows Platform

修改目标平台为Windows.Universal Change your Target to Windows.Universal

按照指引文档适配后,你的应用可以运行与UWP平台上啦,包括手机、PC、XBox和HoloLens等等。

现在让我们打开 AppX的项目清单文件,确保你的UWP应用可以在HoloLens上运行。

  • 打开你的VS项目,导航到清单文件
  • 右键Package.appxmanifest清单文件,选择

HoloLens开发手记 - 构建2D应用 Building 2D apps

  • 确保在<Dependencies>节下的目标平台是Windows.Universal
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.10240.0" MaxVersionTested="10.0.10586.0" />
</Dependencies>
  • 保存清单文件

你可以使用任何文本编辑器来修改此清单文件,效果都一样。

在模拟器上运行应用 Run in the HoloLens Emulator

现在你可以直接生成项目并在HoloLens模拟器上运行你的应用。

HoloLens开发手记 - 构建2D应用 Building 2D apps

  • 选择HoloLens模拟器作为部署目标

HoloLens开发手记 - 构建2D应用 Building 2D apps

  • 开始在模拟器上进行调试
  • 你可以使用键盘鼠标来模拟HoloLens的操作,来测试你的应用

HoloLens开发手记 - 构建2D应用 Building 2D apps

后续步骤 Next Steps

启动应用时可能会出现以下两种情况:

  1. 应用在被放置好后显示闪屏图片后立即运行,这表示一切正常。
  2. 应用在被放置好后出现载入动画,最后仍然只显示闪屏图片,这说明你的应用启动时发生错误,需要解决。

如何调试 How to debug


HoloLens是新出现的Windows 10设备,所以许多UWP API在HoloLens上仍处于测试和开发阶段。下面是一些我们发现的问题:

  • 应用启动时不支持文件系统查询操作
  • 使用Web认证代理或Web客户经理以外的传统认证方式
  • 启动时会较深入的查询硬件设备
  • 启动时会使用日历、联系人、协议等API
  • 使用一些大的第三方库可能会导致不能通过HoloLens上的审核

为搞明白是什么原因导致你的应用不能正常启动,你需要进行调试。

通过调试器运行应用 Running your UWP app in the debugger

调试步骤很简单,通过菜单Debug > Start Debugging即可。

  • 如果应用发生未处理异常会第一时间被调试器捕获,VS里会显示相关的异常信息。如果你已经在应用里使用try catch做了异常捕获处理,那么异常信息可以被你的代码获取到,可以像下图那样显示出来。

HoloLens开发手记 - 构建2D应用 Building 2D apps

  • 你也可以通过打断点单步调试来详细定位到问题代码块,一般来讲可以解决大部分问题。

了解应用错误的原因 Understanding the failure

正如上文提到的,HoloLens开发者版存在一些由测试和开发中的API导致的已知问题。如果你的应用使用了潜在问题API列表中的API,那么可以通过Windows Feedback工具反馈给微软。

如何打开Windows Feedback工具

  1. 手势唤出开始菜单
  2. 打开Windows Feedback应用
  3. 选择Developer Platform,然后发送出错细节给微软

微软会持续地修复UWP API的问题。但是对于一些因为设计时就不支持HoloLens的API,下面是一些可能有帮助的解决模式:

错误码 Error codes

  • 不应该返回一个特殊的HRESULT错误,因为这个API目前还没完善。 相反,API应通过使用空集合,布尔返回值,显式状态代码等抛出错误信息。请注意,如果API已经由于编程错误(例如传递无效参数)而返回HRESULT,则它将 继续酌情返还这些错误。

集合 Collections

  • 当我们使用属性索引器或者方法的返回值是集合时,不应该简单地直接返回一个null对象,而最好返回一个数量为0的集合对象。
  • 在一些罕见的情况下,API会暴露一个可读/写的集合类型属性,允许应用程序提供自己的值。 在这些情况下,如果API在完全功能的情况下已经返回null,它应该在部分功能的情况下继续返回null。 注意,这是一个API设计的反模式,大多数UWP API一般不应该遵循它。

异步方法 Asynchronous functions

  • 不应该从Async异步方法返回空IAsyncAction或IAsyncOperation结果。 相反,它们将返回已经处于任务完成状态并具有适当结果(空集合,状态代码等)的有效对象。

事件 Events

  • 事件不应该失败或者忽略事件注册行为。相反,API应该接受事件注册/取消事件注册,但绝不会引发事件。 API必须持有任何已注册的事件处理程序(而不是默默地忽略它们),因为应用程序可能无意中依赖注册的事件进行生命周期管理。

更新UI Update your UI


现在你的应用在HoloLens中以2D面板的形式展示在世界中,我们下面应该让我们的应用看起来更漂亮。下面使一些要考虑的内容:

  • HoloLens将以固定分辨率和DPI运行所有2D应用,相当于853x480有效像素。 考虑你的设计是否需要在这个比例下进行细化,并考虑查看我们的2D UI指南,来提高用户体验。
  • HoloLens不支持2D动态磁贴。 如果您的核心功能显示活动磁贴上的信息,请考虑将该信息移回应用程序。
  • HoloLens不支持共享合同,2D打印,全屏模式,投射和可能在您的应用程序中的其他功能。

新的输入可能性 New input possibilities


HoloLens使用先进的深度传感器感知世界和用户。 这使得高级手势得以使用,如bloom和air-tap手势。 强大的麦克风还确保了较好的语音体验。 HoloLens负责处理UWP应用的所有复杂内容,将您的Gaze和手势抽象并转换为常规UWP输入机制的指针事件。 例如,HoloLens Clicker模拟Air-Tap手势,但2D应用程序不需要知道输入来自哪里,它们只知道发生了指针点击事件。
以下是将UWP应用迁移到HoloLens时应了解的关于输入方式的高级概念/方案:

  • 当用户注视应用时,Gaze会触发鼠标悬停事件,可能意外地触发菜单,弹出窗口或其他用户界面元素,
  • 凝视不如鼠标输入那么精确。 对HoloLens应该使用适当大小的点击目标,类似于触摸友好的移动应用的UI。 应用UI边缘附近的小元素特别难以与之交互。
  • 用户必须可以在应用中切换输入模式,从滚动到拖动到两个手指平移手势。 如果您的应用是为触摸输入设计的,请考虑确保没有主要功能只依赖手势。 如果是,请考虑使用其他输入机制,例如可以启动手指平移手势的按钮。 例如,地图应用程序可以使用两个手指平移进行缩放,但具有加号,减号和旋转按钮,以模拟与单次点击相同的缩放交互。

语音输入是HoloLens体验的关键部分。 我们已经启用了在Windows 10中的所有语音API为HoloLens上的Cortana提供支持。

发布和维护你的UWP应用 Publish and Maintain your Universal app on HoloLens


一旦你的应用可以正常运行,那么你就可以打包它并将它上传到应用商店中