微软在 2012 年 6 月 21 日发布了 Windows Phone 8,带来大量的功能更新和全新的 SDK,其重头戏的部分是引入了 C++ 和 DirectX,这让众多 C++ 和 DirectX 现有代码库可以直接移植到 Windows Phone 8 上。
2014 年 4 月 14 日,微软发布了 Windows Phone 8.1 开发者预览版。更加丰富的 API 给开发者带来极大的便利和强大的功能,同时 WP8.1 与 Windows 8.1 的 API 几乎相同(可参考微软的官方文档以及智机网的这篇帖子),这样省去了大量的移植时间。
本文从Windows Phone 8.0 到8.1 两个部分来介绍WP 平台为地图开发提供的功能。
DirectX
我们在新版“高德地图 Windows Phone 8 SDK”使用了 DirectX。对比之前的 Windows Phone 7 栅格版地图,DirectX 带来了以下改进:
1. DirectX 可以使用托管的方式和 XAML 交互,使地图可以以一个控件的形式出现,这样便于第三方开发者控制和使用。
图 1. D3D 控件演示
2. 由于 WP8 的硬件规格升级,使用 DirectX 可以提供更高的绘制帧数,从而使地图在运行的过程中显得更加流畅。
3. DirectX 是 3D 引擎,因此可以为提供之前栅格地图不能提供的 3D 效果,同时支持旋转角度,更改仰角:
图 2. Windows Phone 8 3D 引擎
4. 可以控制在不同的 zoom 下展示不同细节的信息,比如在一定 zoom(地图的层级)级别以下出现楼块信息。
图 3. 不同 zoom 下展示不同细节的信息
5. 在绘制线段时,可以在带纹理的同时混入自己需要的颜色,便可以制作一个 2D 地图上不能比拟的线段。
图 4. 带纹理线段与纯色线段效果对比演示
多线程
微软给 C++ 带来了 task,task 是用于异步操作的一个类。只需要简单的代码就可以创建异步操作:
// 这是一个创建异步的例子 create_task([this] { // 做一些操作 //lots of codes }).then([this] { // 在上述操作完成后再执行以下代码 //lots of codes });
在地图中我们使用的最多的场景便是异步读取 hlsl 文件来完成 DirectX 的绘制准备工作。由于读取文件下载等耗时的操作都通过异步来完成,则可以不用让主线程等待其完成,从而达到加快进入地图页面的效果。
图 5. 简单的单线程演示
图 6. 简单的多线程演示
等待多个线程都完成再进行下一步也很简单(如上图初始化完成需要 3 个线程都完成)
// 两个线程(task)都完成后再进行下一步操作 (task1 && task2).then([this] () { //lots of codes });
同内核带来的高代码复用率
微软在带来 C++ 的同时也更新了 Windows Phone 8 的内核,使 Windows 8 和 Windows Phone 8 都为 NT 内核,这为代码的复用提供了便利。高德地图的 Windows 8 平台街景引擎在开发过程中复用了 Windows Phone 8 的大部分代码,对 C#层的接口稍加修改便可正常运行。在未来的 WP 8.1 后,Windows Phone 8.1 可以复用几乎所有的 Windows 8.1 的代码,同样的内核代码只要针对不同平台进行封装,便可直接实现代码复用。
图 9. 街景移植简单的封装演示
其他功能
在 Windows Phone 8 中,微软加入了 SD 卡的支持,这方便了我们把离线地图存在 SD 卡中,用户可自行操作 SD 卡删除地图,同时也能节省手机本身的存储空间。
在 WP8 中,微软增强了位置服务,使其能在用户离开地图应用后继续获取位置信息,这样更利于和位置相关的应用的使用范围(例如记录跑步信息的应用)。
语音输入作为信息录入的辅助功能,能够为部分使用场景(例如行车导航中语音搜索)提供强大的帮助。在 Windows Phone 8 中,微软为中文提供了语音识别的功能,增强了中文环境下的地图体验。
在 WP 8.1 中,DirectX 控件从 drawsurface/drawsurfacebackgournd 替换成与 Windows 8.1 相同的 swapchain(用户可选择替换或者继续使用原控件),这为我们带来了以下好处:
a) 更便捷的移植:由上述街景示例可知,相同的街景内核根据平台的不同分别对应了两个控件类型。WP8.1 统一了这一步骤,使得 WP 与 Windows 平台之间的互通更加便捷。
b) 更优秀的 API:不同于 drawsurface,swapchain 在开始时就结合了更多的动画功能,比如 swapchain 手势事件中的 ManipulationDelta 就包括了 flicker 动画(就是拖动地图时的缓动动画)。在原来 drawsurface 中,该事件没有提供此动画功能,需自己结合事件所返回的参数进行额外开发。
WP8.1 还新加入了众多 DirectX API ,其中:
a) DirectX2D APIs 能够为地图提供更加简单有效的绘制数学图形的方法,同时在特定场合(例如室内地图)能够比 DirectX3D 提供更加快捷有效的解决方案(因为不用牵扯到复杂的三维运算)。
b) DirectWrite 提供了原生的字体解决方案。在 WP8 中。开发者们只能通过引用第三方控件(例如 freetype)来实现在 D3D 中贴入文字。8.1 则提供了原生的字体 API,使得开发能够更少的引入第三方 lib 库。
最后,WP8 提供了一个叫做 Geofencing 的新功能:开发者不用自己编写代码来进行后台的位置信息记录管理,只需要简单的调用这个类,就可以在手机进入开发者所界定的经纬度范围时获得通知。这为位置闹钟之类的功能提供了很大的便利性。该功能的示例代码可在MSDN 查看。
感谢杨赛对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。
评论