BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

WP8/8.1对地图开发的改进

| 作者 翁乐 关注 0 他的粉丝 发布于 2014年5月9日. 估计阅读时间: 7 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT