摘要:该文以安卓平台上一款游戏模拟器的云化过程为例,分析了研发背景和云化方案的选择思路,根据游戏模拟器的特点设计了轻量级、低损耗的音视频拦截方案,给出了具体实施的系统架构和各模块功能,并针对解决方案中存在的问题提出了节约系统资源、提高用户体验、减少用户流量成本的一系列优化方法。
关键词:游戏模拟器;云游戏;音视频拦截方案;解决方案;性能优化
中图分类号:TP37 文献标识码:A
文章编号:1009-3044(2022)01-0116-03
1 背景
随着智能手机的普及,原来传统游戏平台遇到了瓶颈,面临淘汰的风险。游戏平台升级会带来老用户体验下降、用户流失,如果游戏平台不升级但是随着用户手机硬件变为智能手机而无法使用。因此,如何利用软件技术实现传统游戏平台到云游戏平台的转化,实现用户体验不变,又能很好地兼容不同的智能手机硬件是传统游戏平台急需解决的问题。
某公司就是该场景的典型案例,该公司有一款面向功能机的游戏模拟器产品。该产品在功能机为游戏开发提供了统一接口,屏蔽了不同机型的硬件差异。基于该模拟器开发的游戏可便利地在不同功能机上移植,因此吸引了众多游戏开发商为其开发游戏,而丰富的游戏内容为该模拟器吸引了大量用户。
随着智能机时代的到来,该游戏模拟器被移植到安卓平台。因市场环境变化,新增用户较少但仍有大量存量用户。
某段时间,该公司发现存量用户的流失加快。经市场部门调研发现是因为苹果发布新手机,导致不少用户从安卓手机更换为苹果手机。经进一步调研得知,这些更换手机的用户都是公司从功能机时代积累起来的,具有较高的忠诚度,他们仍然希望在苹果手机上能够使用对应的游戏模拟器。
为此市场部门要求研发部门在iOS平台提供对应的游戏模拟器产品,以防止安卓手机上的用户进一步流失,并挽回已迁移到苹果手机上的用户。
2 技术方案选择
2.1 移植方案
研发部门计划把游戏模拟器和游戏从安卓上移植到iOS系统上,但是经研究发现两者均存在困难。
对于游戏模拟器,移植的困难有三点。1)游戏模拟器代码规模庞大,达数十万行,且逻辑复杂;2)游戏模拟器底层需要针对iOS平台做大量的接口适配工作,技术挑战大;3)游戏模拟器产品已经处于维护阶段,只有少数员工维护,开发所需的人力资源不足。
对于游戏的移植,虽然不需要变动游戏逻辑(因为游戏模拟器屏蔽了设备和系统差异),但是需要游戏编译iOS平台的版本。然而这些游戏年代久远,不少开发商已经联系不上或者注销,无法被重新编译。
综合考虑,移植方案不可行。
2.2 云游戏方案
由于移植方案的成本高昂,那么是否有其他方案呢?研发部门把目光投向了云游戏解决方案。
云游戏是使得在计算能力较弱的客户端能运行高品质游戏的一种方式。云端运行游戏逻辑,而客户端仅仅是展示游戏画面、播放音频,以及收集、传递用户的控制命令发送到云端。因此可以避免客户端上大量的移植和改造工作。由于模拟器上的游戏都较老,分辨率普遍较低,也适合做成云游戏。
实现云游戏的关键是服务端能高效快速地实现对游戏音视频的拦截。传统的拦截方式有两种:一种是在设备截获其音视频,进行编码,这种方式需要依赖较高级的硬件配置。另一种是hook操作系统中游戏用到的图像绘制和音频播放接口,以拦截对应的数据流,这种方案需要了解对应操作系统的相关接口[1]。
如果采用上述拦截方式,需要涉及大量研发部门未曾用过的技术,不利于在资源少、投入少的情况下快速开发,因此还需另辟蹊径。考虑到游戏的绘制、音频播放都是调用游戏模拟器的接口,如果在相应的接口层拦截数据,也可以达到和传统拦截方式同样的目的。这种轻量级的拦截方式不仅技术难度较低,而且还因为避免绘制游戏或者拷贝显存而更加高效。
3 技术架构设计
3.1 技术框架设计
整体技术方案的框架划分为模拟器端、服务器端和客户端。模拟器端运行真实MRP游戏,实现画面拦截转发,模拟用户操作游戏动作。服务器控制模拟器管理,进行数据转发(通过TCP连接)。客户端展示游戏画面、拦截和转发用户行为,且实现登录等其他基本功能。模拟器端由节点管理服务矩阵组成,服务器端由数据库、配置服务和ftp服务组成,客户端为移动终端。具体架构如图1所示。
1)iOS客户端。iOS客户端是用户使用云游戏的入口,按照安卓游戏模拟器界面风格设计,出于跨平台的考虑,使用h5技术实现。
用户先需登录客户端以获取访问云游戏系统的权限。之后,客户端请求列表服务获取可用的游戏列表,展示在界面上。当用户在界面上选择使用某款游戏后,客户端启动该游戏的一次云服务过程。
在云游戏过程中,客户端首先向游戏模拟器资源分配服务申请资源,接着连接到资源中指定的游戏数据传输中介服务,之后借助于传输中介服务和云端的游戏模拟器通信,进而完成整个云游戏的过程。
2)游戏列表服务。游戏列表服务是云端供客户端查询云游戏列表的接口。它通过查询配置数据库把查询结果返回给客户端。配置数据库中的数据由运营人员通过部署服务器配置。
3)游戏模拟器资源分配服务。游戏模拟器资源分配服务是云端供客户端创建云游戏服务的接口。
空闲的游戏模拟器会连接到游戏模拟器资源分配服务,等待任务分配。当游戏模拟器资源分配服务收到客户端连接请求时,它会把请求转发到某个等待中的游戏模拟器,之后将游戏模拟器返回的资源信息转发给客户端。
4)游戏数据传输中介服务。游戏数据传输中介服务是客户端和游戏模拟器传输数据的中介。它的主要任務是协助客户端和游戏模拟器进行对接及数据转发。
5)游戏模拟器集群。云端有多台服务器节点,每个服务器节点装有Ubuntu系统 + VirtualBox + genymotion环境[2]。Genymotion可创建多个安卓模拟器实例,每个安卓模拟器可以安装一个预装了目标游戏的游戏模拟器应用,由此组成游戏模拟器集群。每个游戏模拟器可为一个用户提供云游戏服务。由于游戏模拟器处于内网不能直接被客户端访问,因此必须通过游戏模拟器资源分配服务和游戏数据传输中介服务才能为客户端提供服务。
游戏模拟器有三种状态,空闲、等待以及忙碌状态。在空闲状态下,它连接到游戏模拟器资源分配服务等待任务的分配。取得任务后它连接到游戏数据传输中介等待客户端连接,同时将资源信息(模拟器id、对接客户端的游戏数据传输中介服务器url地址)返回给游戏模拟器资源分配服务。此时进入等待状态。在等待状态下,如果在规定时间内对应的客户端连接到了游戏数据传输中介服务,则游戏模拟器进入忙碌状态。此后,它启动目标游戏、拦截并转发数据到客户端、接收并处理来自客户端用户控制命令。最后,当一次云服务结束时,客户端、游戏数据传输中介服务、游戏模拟器之间的连接被销毁,游戏模拟器重新恢复到空闲状态。
6)配置服务。配置服务是运营人员部署云游戏的接口。运营人员可以通过配置服务配置系统支持的游戏列表,为每款游戏设定对应的部署资源包,并将该部署资源包指派给特定的服务器节点。
部署资源包中含有genymotion安卓模拟器镜像和部署参数文件,其中镜像上预装了含有目标游戏的游戏模拟器。它最会被上传到ftp服务器供需要服务器节点下载。
7)节点管理服务。节点管理服务负责在服务器节点上的部署云游戏。它定时配置服务本节点的部署资源包。如果有新部署资源包,它会则下载到本地。
下载完毕后,它先执行genymotion命令卸载所有老安卓模拟器镜像,然后使用部署资源包中的新安卓模拟器镜像创建并启动多个实例。最后,它再根据部署资源包中的部署参数文件启动、配置游戏模拟器。
3.2 交互设计
系统的客户端和游戏模拟器对接、传输数据的完整过程如图2所示。通过加入游戏列表、游戏模拟器资源分配服务、游戏数据传输中介服务将每个用户占用一整套服务资源进行云化,根据算法进行分步、分时为提供用户不同操作下异步的请求实现多用户多端口并行处理服务。
4 技术框架的实施
4.1 用户到云游戏模拟器端的技术实施
游戏模拟器上的游戏端与服务器保持长链接,浏览器端与服务器保持长链接。
登录行为:浏览器端html实现输入框弹窗,登录时将账号密码封装成protobuf数据包发送至游戏模拟器端登录成功后启动游戏。
断线行为:当网络环境不好或用户关闭浏览器时,浏览器端与服务端的长链接断开,此时,游戏模拟器端与服务器端的长链接会持续保存5分钟,如果5分钟后无再次连接,游戏模拟器端就会重启游戏进程重新连接服务器,如果5分钟内浏览器端重新连接上,那么服务端会将该浏览器与游戏模拟器重新匹配上,达到断线重连的效果。
点击行为:游戏模拟器上的游戏端画面分辨率为240x320,所以在浏览器端画面等比放大,浏览器端捕捉点击与抬起事件,当滑动屏幕时,定时捕捉屏幕坐标作为点击事件,捕捉到的事件通过protobuf协议封装成数据包发送至游戏模拟器的游戏端[3]。
4.2 云游戏模拟器的技术实施步骤
将游戏在模拟器上后台运行多个(节省服务器资源)。游戏模拟器上额外运行一个管理程序,负责游戏的启动关闭,异常处理。
每个游戏启动一个连接至中转服务保持的长链接,浏览器端发起websocket长链接至中转服务。
中转服务将浏览器端的长链接与游戏端的长链接进行互传数据。
游戏端在收到浏览器端發来的指令后启动游戏,生成游戏画面,分片抓取生成数据包传输至浏览器端。
浏览器端收到数据之后分片在不同屏幕区域上进行展示画面。
游戏端根据摘要算法对每个数据包缓存md5值,发送数据包的时候进行md5值比对,不发送相同的数据包。
在前端进行数据包缓存,根据md5值进行存取达到节省流量提高运行速度的效果。
浏览器端捕捉屏幕触摸事件,输入框或按钮生成指令发送到游戏端进行交互从而控制游戏。
5 系统性能优化
相比而言,云游戏方案避免了移植所带来的巨大工作量和风险,但是它也存在一些问题。一方面,由于游戏实例都集中在云端的服务器节点运行,使服务器节点的计算能力成为瓶颈。另一方面,云游戏需要处理、传输大量音视频数据,容易引发延时、卡顿、用户流量消耗过大等问题。为此,研发部门采用了如下几类措施进行优化。
5.1 优化资源
1)精简模拟器镜像。删除genymotion镜像上无关的系统应用,如邮件、联系人、图库等,以减少镜像内的存储资源占用。
2)多开游戏模拟器。通过变更包名的方式,可多个游戏模拟器可在安卓上同时运行。在某特定型号的服务器节点上,可支持同时开启5个安卓模拟器,每个安卓模拟器可开启5个游戏模拟器。故单节点可支持25个用户,并发量大大提高。
3)自动化缩放游戏模拟器集群。通过实时监控游戏模拟器集群的连接状况,可以动态缩放集群的规模。当总连接数超过最高阈值时,配置管理模块可以自动化快速动态部署新游戏模拟器到新服务器节点;当总连接数低于最低阈值时,配置管理模块则自动化取消部分服务器节点,释放资源。
5.2 减少视频数据传输
1)单图片分块传输。模拟器游戏的一个特点是存在大量的只有局部图像变化的场景(例如砍杀怪物时),此时没有必要传输全部的图像。
游戏模拟器把游戏画面分块,检测各个区块的变化,并仅将变化的区块发送到客户端[4]。客户端只需增量更新其中变化的部分。由于游戏的分辨率不高,大多只有320x240,因此分块算法所消耗的CPU在可以接受的范围内。此项优化大大减少了网络传输的图像数据量,自然而然也降低了网络传输的不确定性和时延。
2)帧优化。根据游戏在游戏模拟器平台上的开发约定,游戏过程中游戏只能在模拟器的局部区域内绘制画面。当播放过场动画时,需要切换到全屏绘制。
因此游戏模拟器可以根据接口层检测到的绘制尺寸的变化来判断游戏是否处于过场动画阶段。如果处于过场动画阶段,游戏模拟器只拦截并传输过场动画的第一帧,丢弃后续帧。直到绘制区域大小发生变化(意味着过场动画结束,重新进入游戏界面)。
这种方法是牺牲部分用户体验,节省了数据传输成本。
3)优化网络协议。客户端与中继、中继与云端的交互中,都使用protobuf协议封装数据[5]。目的是减少传输的协议数据量、且提高解析速度。protobuf具有平台无关和语言无关的优点,易扩展,便于在服务端和客户端异质平台通信。解析速度比解析XML快约20-100倍。且序列化数据非常紧凑,其序列化之后的数据量约XML文本方式的1/3到1/10。
6 结束语
经过上述优化,整个云游戏系统能稳定地工作。最终客户端和服务端的处理和传输的时延小于100ms,游戏所需的带宽约为30KB/S,画面较为流畅,用户体验良好。因单台服务器节点支持25路并发服务,部署十台服务器可供250个用户同时在线,满足了业务部门的目标。
参考文献:
[1] 刘颖,秦贵和.基于iOS远程控制应用的设计与实现[J].吉林大学学报(信息科学版),2011,29(5):451-456.
[2] 姜洪涛.基于WPF的云游戏时延可视化系统设计与实现[J].工业控制计算机,2019,32(6):76-77,80.
[3] 刘萤.基于私有云平台的手游开发环境构建研究[J].计算机产品与流通,2018(4):145.
[4] 关鹏宇.基于云技术的网络游戏平台的设计與实现[D].长春:吉林大学,2015(12).
[5] 梁国壮,安在秋,田涵雷,等.基于网络协议的无线远程数据传输系统设计[J].现代电子技术.2020,43(6):23-26.
【通联编辑:谢媛媛】
收稿日期:2021-09-16
作者简介:吕丽珺(1981—),女,浙江松阳人,讲师,硕士,研究方向为网络应用技术、电子商务应用和商务数据分析。
3808500338226