免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4686 | 回复: 1
打印 上一主题 下一主题

基于位置的实时游戏MapAttack的技术实现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-16 19:02 |只看该作者 |倒序浏览
基于位置的实时游戏MapAttack的技术实现









MapAttack是一款实时的,基于地理位置的游戏,其通过Socket.io,node.js,和Redis实现了其实时性。下面文章对整个游戏及其技术实现进行了描述,推荐给大家。

这里我将向大家表述我们如何利用Socket.io、Redis、Node.js以及一路上我们所学的东西来规划、开发并测试一款实时的、基于位置的游戏。在过去的几个月中,我们将大部分的空闲时间都用在了开发一款实时游戏上,由于它是基于地图环境的,所以我们称之为“MapAttack!”,并把它作为我们LBS平台Geoloqi的一个测试程序。游戏中,两组队员互相竞争,尽可能多的攻占游戏界面上的小圆圈。而在这里,游戏界面其实就是城市中玩家周围的街道。



图 1 MapAttack的游戏界面

Geofence在这里指地图上带有数字的小圆圈,玩家进入这些小圆圈后,就会得到与圆圈中所标记数字相同的分数,它所在小组的总分数也会相应增加,同时圆圈的颜色会变成该玩家小组的颜色。

我们来看一段这个游戏的视频:

http://v.youku.com/v_show/id_XMzExMjExMTI4.html

为什么要开发这么一款实时Geofencing游戏呢?
我们想要创造一款游戏,它能够让人们与真实世界物理交互,而不是像第一人称射击游戏或者即时战略游戏那样通过电脑控制台来交互。同时,我们也是受到了真人版吃豆人(PacManhattan)的启发。

技术挑战
处理用户进入区域的检测,同时留出200+的小圆圈。

处理一局游戏中所有手机位置信息的更新量(一局游戏有20或者更多用户)。

允许每台手机或者观看游戏的Web浏览器都能实时地看到玩家们的移动和圆圈颜色的改变。每台手机都会将它的位置发送给服务器,服务器会广播这些位置数据给其他手机以及观看游戏的浏览器。

处理GPS技术在不同智能手机模型间的错误和差异以保证游戏的公平体验。

GPS硬件的差异
众所周知,GPS信号反映了城市中高层建筑的情况。这就导致了在位置数据方面的不准确和不一致。这点在新手机上并不显著,但是在较老的手机上却十分明显。






图 2 MapAttack系统架构

Socket.io
Socket.io是一个跨浏览器的Web套接字实现,它允许在浏览器上做实时数据更新,并且也支持老的浏览器。多亏了Socket.io我们可以利用最新的技术,同时不用要求所有我们的用户升级到最新的浏览器。这让我们实现了游戏中浏览器和手机间的即时更新。

Node.js
Node.js是谷歌浏览器的V8 Javascript引擎事件驱动的I/O实现,它由一个反应器实现,而这个反应器使得大量异步数据的传输得以实现。

当手机要发送数据时,我们用一个Node.js服务器将位置数据流从手机传输到Redis的发布频道或者订阅频道上。数据发布到Redis上,另一个Node服务器订阅该频道。我们的Node.js服务器接收手机通过一个类似Google’s Protocol Buffers的顾客协议发来的更新,实际上就是压缩的二进制的JSON。

当一个浏览器想要开始发送数据流时,它连接Socket.io服务器然后这个服务器订阅Redis的发布频道或订阅频道。这个Socket.io服务器通过Websockets向浏览器发送数据,如果Websockets不可用,闪回或者长轮询作为后备方式。

本质上讲,Socket.io允许我们使用Websockets规范,这是全新的,但同时也能工作在较老的浏览器上。

Redis
Redis是一个开源的、高级key-value存储系统,它支持消息队列使用发布/订阅模式。

从较高层次来说,Redis让我们所能做的事,是控制把数据实时发送到所有游戏中的手机和浏览器。游戏中的每一台手机把它的位置发送给服务器,服务器广播这些数据给其它手机和正在观看游戏的浏览器。

关于发布/订阅系统的一件吸引人的事:使用一个传统的系统你不得不维持许多连接,并且为了通过连接发送数据,你不得不重复发送,与发布/订阅系统不同,如果你有10,000个用户,你将不得不重复通过10,000个连接,发送回非常缓慢,并且容易出现死锁在套接字上的问题。

使用Redis的发布/订阅模式,就像启动一个广播电台。一旦把它打开了,人们(在这里指的是浏览器)就可以收听。这让我们能够把实时数据大规模地更新给客户端(浏览器和手机)。

Sinatra Synchrony
Sinatra::Synchrony是Sinatra的一个小扩展,它动态提升了Sinatra网络应用的并发性。由于EventMachine和EM-Synchrony的支持,当你有很多传输和低速IO请求时(如向外部APIs发送的HTTP请求),它增加了你的应用每个过程可服务的客户的数量。由于它内部使用Fibers处理堵塞的IO,所以没有回调的需要。这意味着我们可以像写一个正常的Sinatra网络应用那样进行开发。

Sinatra::Synchrony允许我们做异步程序,除了那些在Fibers中封装了回调操作的。这让我们能够实现同步程序的同时利用异步代码的优势。除了可以这样简单地变成,它也让我们根据需要可以转换一个不同的并发策略。

The MapAttack Game Server
最后,有一个MapAttack游戏的服务器,在这里,这个游戏服务器是一个简单的数据库,他负责存储玩家在地图上显示的所在点的数据,以及手机上玩家需要实时去抢夺的点的数据。

英文原文:blog.programmableweb.com

译文出处:www.lbsvision.com

论坛徽章:
0
2 [报告]
发表于 2012-02-17 22:43 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP