写点什么

WP8/8.1 对地图开发的改进

  • 2014 年 5 月 08 日
  • 本文字数:2124 字

    阅读完需:约 7 分钟

微软在 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 )关注我们,并与我们的编辑和其他读者朋友交流。

2014 年 5 月 08 日 03:161321

评论

发布
暂无评论
发现更多内容

仿生智能 | 初号机的成长之路序章

九叔(高翔龙)

人工智能 AI 机器人 Robot

架构师训练营第一周学习总结

韩儿

世界上最难的5种编程语言

艾小仙

编程语言 编译 esolang

科大讯飞开发者大赛:首届X光安检图像识别挑战赛结果出炉

Talk A.I.

极客大学架构师训练营2期第一周 作业

渡江卿

成为架构师 - 架构师训练营第01周

陈永龙Vincent

架构师训练营第五周作业

吴传禹

极客大学架构师训练营

架构师训练营培训第一周作业

lakers

极客大学架构师训练营

第五周总结

_

架构师一期 架构师第五周总结

这本书可能是给用户最好的礼物——专栏《软件交付那些事儿》上线

刘华Kenneth

架构师训练营 - 第一周课后练习

joshuamai

一、食堂就餐卡系统UML设计

Geek_28b526

我在苦苦坚持的时候,WebStorm已经悄悄的“真香”起来

小Q

Java 学习 架构 面试 webstorm

架构师训练营第 1 期 week5

张建亮

极客大学架构师训练营

架构师训练营第一周总结

小兵

架构师训练营第 1 期第 5 周学习总结

好吃不贵

极客大学架构师训练营

什么! 你还在使用 if (xxx != null)做NullPointerException判断?

刘超

Java Optional

食堂就餐卡系统设计

Jack

架构设计

《我想进大厂》之JVM夺命连环10问

艾小仙

Java 编程语言 JVM jvm调优

《我想进大厂》之Dubbo普普通通9问

艾小仙

Java dubbo RPC HTTP

架构师训练营1期第5周作业--一致性哈希算法

木头发芽

c++nullptr(空指针常量)、constexpr(常量表达式)

良知犹存

c++

美滋滋!阿里内部最新出台Java开发规范和系统性能优化指南~

Java架构追梦

Java 学习 架构 面试 性能优化

Week1-架构方法学习

evildracula

学习 架构

架构训练营第一周学习总结

Jack

食堂就餐系统UML图

小兵

前端更应懂产品

执鸢者

产品 腾讯 大前端

架构师训练营第五周总结

吴传禹

极客大学架构师训练营

玩一场用户故事的Cosplay

Bruce Talk

Agile 用户故事 Product Owner

甲方日常 37

句子

工作 随笔杂谈 日常

第一周作业1:设计图表

韩儿

WP8/8.1对地图开发的改进_微软_翁乐_InfoQ精选文章