那么,如何实现一款从0到1的微信小游戏呢? 微信小游戏背后的技术本质是什么? 提供哪些功能和游戏玩法? 使用小程序和云开发会给您带来哪些独特优势? 带着这些问题的答案,来自腾讯云·云开发团队和微信团队的四位讲师开始了本次技术讲座。
如何开始开发一款小游戏?
众所周知,微信第三方开发分为两类。 一种是基于业界通用的Web技术框架开发的微信H5和公众号文章,另一种是基于微信技术框架开发的包含微信私有技术特征的普通小程序。 与迷你游戏。
H5、普通小程序和小游戏的区别中,小游戏是目前唯一真正支持使用关系链数据的。 对此,腾讯高级工程师周桂华(花叔)解释说,微信用户的关系链数据包括两部分,一部分是用户好友的用户数据,另一部分是微信好友的群成员的用户数据。用户所属的特定组。 过去,为了保护用户关系链数据,微信会基于技术框架在前端创建一个封闭的子域,主域会失去信息而开放数据。 这个开放数据也是子域。 每当子域需要暴露关系链的数据,比如绘制排行榜等业务场景时,都需要将排行榜绘制在一个封闭的sharedCanvas上,然后将sharedCanvas渲染到主域的屏幕上。
然而,子域名不可能提出第三方请求。 每个开发者的数据库都是微信在托管服务器中定义的,你的业务数据只能和主域交互。 但在最新的开放能力中,微信提供了JSServer服务器和交互式托管数据。 其中,交互托管数据是好友之间交互数据的单独副本,而JSServer的作用是验证用户数据,并将数据存储在普通托管数据中。
拥有重构工程师和设计师“双重身份”的华叔在演讲中提到了自己第一次开发小游戏的经历,并深有感触地说:“如果你第一次做游戏,你会有一种感觉,就像你在创造一个世界一样。其实第一款游戏我最大的感受就是我很开心。”
2017年,小程序诞生了。 为了学习如何开发小程序,华叔尝试做了一个关于思维导图的小程序工具。 当小游戏出现时,华叔就默默地定下了独立开发小游戏的目标。 在开发过程中,花叔逐渐发现CreateJS对于制作游戏来说有点弱。 是一种偏过程式编码的开发方式。 虽然在制作数据调用和程序逻辑方面比较灵活,但CreateJS在制作游戏UI效果方面会比较弱,因为逐行编写代码效率不高。 在实际的游戏开发中,有大量的工作涉及到制作UI效果,所以CreateJS在游戏开发上还是稍显逊色。 可以说它只是一个代码库。 要真正制作游戏,您仍然需要完整的开发工具包。
那么,以程序开发的形式来开发游戏太累了,怎么办呢? 之后,花叔逐渐转向Coccos Creator。 起初,身为码流的华叔并不习惯Coccos Creator的开发流程。 其开发理念以工作流为核心,让不同职能的开发人员能够快速找到发挥最大作用的工作切入点,并有默契。 与其他团队成员顺利合作。
简单来说,Coccos Creator 将游戏中可能用到的各种功能或元素封装成组件。 这些组件有自己的回调方法。 组件可以在可视化开发工具中拖动组装,形成游戏。 Coccos Creator的另一个好处是它规定程序员可以定义一些属性,这些属性可以暴露给其他同学修改。 这样就可以很好地解决前端需求、开发质量和开发效率的问题。
但还有另一个问题。 传统的服务器后端解决方案过于复杂。 半前端开发工程师如何独立快速开发游戏? 以华叔开发的《影子游戏》为例。 这个游戏也是基于Coccos Creator,后端解决方案与上面不同,它是基于云端的。 此时的技术框架就非常简单了。 上面是小程序云,下面是小游戏端。 小程序云开发只需要一个前端开发。
小程序·云开发解决的问题是前端开发和后端开发的并行过程。 小程序·云开发提供三大功能、两大套餐。 三计算是指小程序·云开发提供数据库、存储、云功能的能力。 这两个包指的是认证和云调用。 其中,在调用某些方法时,开发者需要实现服务端API的AccessToken机制或者小程序的登录认证,但这些并不需要担心。 小程序·云开发已经封装了这些东西,开发者直接使用即可。
小程序·云开发技术支持
自2018年初第一批微信小程序游戏上线以来,不到两年的时间,微信小游戏生态已拥有数十万开发者,月活跃用户达到4亿。 其中,超过58%为30岁以上用户,31%为40岁以上用户。 未来,家长将成为小游戏的主力军。
小游戏生态的繁荣来自于优秀的基础能力。 从发布初期的原生Canvas到完成主流引擎的适配,小游戏开发的门槛一步步降低。 除此之外,还有硬件接口暴露、分包加载等基础能力。 ,正在不断拓展游戏开发的边界。 基于微信的关系链,以及基础设施层面数据运营能力的提升和云开发提供的便捷服务,整个生态系统进入了良性循环。 开发者可以利用这些东西来完善自己的小游戏,并从游戏中获得收益。 促销和收入。
那么,为什么会有云开发呢? 众所周知,传统的开发模式对于业务发展存在一些难以解决的痛点。 腾讯云开发团队前端工程师杨航解释说,在生产级应用的开发中,除了业务逻辑之外,还有太多的东西需要处理。 为了保证服务的稳定性,需要庞大的周边设施,包括负载、高可用、安全、监控等。传统模式下,从物理机托管,到使用云端的服务云主机,最后到PaaS级服务,随着服务封装级别越来越高,暴露出来的开发者需要关心的细节就越少,也就释放了更多的人力和投资成本,但最终还是需要专业的运维人员介入维护。 这不仅消耗资源,还带来人力错误引入的风险。
另外,虽然前后端分离在开发层面是一个优秀的架构,但在实际开发过程中,前后端分离带来的权责不清、沟通时间增加,代码调试等挑战让整个开发进度变慢。 喻慢。
那么,有没有一种新的开发模式,可以让开发者更加专注于业务逻辑呢? 从小程序技术角度来看,小程序技术栈主要限于JS,与前端开发相匹配。 使用Node可以在一定程度上共享后端业务,降低沟通成本,前后端分离更彻底,解决业务逻辑开发部分。 问题。 然而氛围,大多数业务开发人员对于各种复杂外围设施的搭建、网络、主机运维等方面的了解非常有限。 如果他们想把它做好,就必须投入大量的时间和精力来建设它。
基于这一思想,腾讯云总结了整个开发过程中通用的基础能力,并进行了更高层次的封装。 运维部分完全隐藏,暴露功能调用接口,直接操作服务。 业务开发者完全不了解环境和运维。 同时,它提供了代码运行容器来解决复杂业务逻辑处理的问题,甚至可以让前端程序员独自接管整个项目,推出了这种无服务的Serverless开发模式。
Serviceless是未来的发展趋势。 从物理机到云上的IaaS层、主机、PaaS层的开放架构逐步释放与开发者运维相关的东西,让开发者更专注于自身业务能力的开发。 。 云开发是Serverless应用服务的中间平台。
云功能是Serverless的核心,也是云开发功能中非常重要的一点。 在云函数中,开发者不需要自己编写逻辑来获取小程序的appid和openid。 云开发通过私有协议将它们放入云函数的运行上下文中,私有协议可以在云函数中获取,并在云函数的前端执行。 如果不进行认证处理,所有到达云功能的请求都是合法登录状态的请求,功能中不需要进行认证操作。
其中云调用是云函数中非常有用的功能。 如果开发者经常开发小程序,需要在服务器上运行的API会使用access_token作为权限标记。 但云调用阻止了这件事。 开发者可以直接在云函数中调用Cloud Open API,整个调用链可以直接打通。
实时推送能力的实现与实践
随着小程序和云开发的流行,开发者希望云开发能够提供通过后端直接向前台推送消息的功能。 由于之前没有这个功能,开发者必须自己搭建WebSocket服务,搭建过程中无法保证良好的可靠性和并发性。 如果想要提供良好的性能,所需的开发成本就会很高。
那么,在现有的云开发能力下,如何开发即时通讯能力呢? 微信小程序研发工程师邓昆利提出了两个关键词——长连接和推送。 持久的连接是所有技术通信服务或所有依赖实时性能的服务的基础。 推送能力需要客户端有主动同步的能力。 另外,存储、消息和文件持久化也非常重要。 首先,结构化文本数据。 这些文本数据通常适合数据库存储。 对于一些较大的数据游戏开发制作流程,比如图片、音频、视频,这些都会存储在聊天记录中。 出现的内容需要通过云存储来承载。
那么,从以上即时通讯服务的三个关键点来看,目前是否可以采用云开发来完成这套完整的即时通讯服务呢? 1、对于长连接,云开发是不满足的,因为云开发是Serverless的短连接。 其次,没有主动同步客户端的能力。 因此,在这种情况下硬件设备,大多数开发者只能使用短轮询来替代长连接和推送。 短轮询就是每隔一段时间向数据库请求一次,看看数据库是否有更新。 如果有更新,就会更新客户端的意外状态。 但短轮询会带来资源浪费、维护开发成本高等一系列问题,甚至在安全性方面,很多开发者会将不应该留在客户端的信息传递给客户端使用,比如access_token 。 和会话密钥。
为此,云开发数据库增加了实时推送更新的能力,实现了直接监控小程序和小游戏终端数据的能力。 开发人员可以监控给定的查询语句。 每当查询语句的结果发生变化时,小程序都会收到包含更新内容的推送,并响应实时数据变化。
实时数据推送的场景有很多,包括即时通讯、状态同步、实时协作等。邓坤力在演讲中举了一个例子,对于小游戏开发来说,状态同步是很常见的,游戏通常都是分为状态同步和帧同步。 对于有状态同步的游戏,例如棋牌游戏,完成的状态由服务器存储。 双陆棋和国际象棋等游戏都是状态同步的类型。 再比如,实时协作场景,文档在线分享,腾讯文档,谷歌文档,项目管理协作工具等等,都是可以通过实时数据推送来完成的事情。
从整体架构来看,实时数据推送能力分为三个模块:小程序前端SDK、中间接入层、后端。 他们各自的业务是:
小程序前端SDK:该业务需要在前端有一些逻辑,以保证服务的可靠性。 然后提供一个简单易用的界面供前端同学使用。
中间接入层:其任务是与前端保持WebSocket长连接。 接入层获取后会轮询后台,将最新的消息事件发送给前端。
后端:是比较传统的服务。 该层监控最新消息并返回。
为了保证数据的可靠性和完整性,小程序·云开发在设计模块时采用互不信任的原则,即上述三个模块互不信任。 为此做了很多冗余设计。 如果系统中的某个模块没有调用成功,小程序·云开发会采取一些措施来弥补这一不足。 例如,小程序的SDK会定期向接入层查询最新消息事件的版本号。 如果发现版本号与本地版本号不匹配,则会重新获取消息事件。 这样,即使数据丢失或者网络连接断开,仍然可以保证数据的可靠性。
为了保证低延迟,所有后端服务除了在接入层提供WebSocket接口外,均采用基于TARS框架的RPC通信。 TARS是一个成熟的开源框架,性能非常好。
为了应对高并发,小程序·云开发也在持续优化接入层,使其能够保持尽可能多的实时连接。
此外,邓昆利在演讲的最后还介绍了云开发最近推出的其他能力,包括现有的HTTP API,可以开放云开发资源,可以直接在其他终端上使用; 数据库聚合,普通数据库的能力无法满足。 ,开发者可以通过聚合进行分组查询和统计查询; 数据库的高级查询,这也是控制台的一项新功能。 以前控制台只能完成简单的数据库操作。 添加此功能后,开发人员可以使用数据库的语法来批量添加、删除、检查和修改数据。
多人在线对战玩法的实现
所谓网络游戏,是指玩家在互联网上与其他玩家一起玩的游戏。 网络游戏的类型有很多,比如《欢乐麻将》、《欢乐斗地主》等回合制多人游戏,《贪吃蛇》、《超级乱斗》、《乱斗英雄》等实时多人游戏等。还有流行的社交小游戏《海盗来了》。
小游戏是在微信、QQ等社交平台上开发的,天然适合带朋友一起玩网络游戏,比如情侣、好友、组队等。不过,目前的小游戏大多是单人游戏。 原因之一是网络游戏背后的业务和技术逻辑非常复杂,开发者需要考虑的问题很多。 这些网络游戏有什么特点呢? 或者说有什么技术上的困难吗? 腾讯云高级产品经理张晓华分析了以下三点:
首先,先组织玩家,因为这是网络游戏。 你必须在互联网上找到一个和你一起玩的人。 相当于有某种组织,把人们在互联网上组织起来。 我们把这个组织整合在一起。 它被称为“房间”。 房间管理比较简单,但是在做在线匹配时,你会发现当很多人发起匹配请求时,一台服务器根本无法支撑,而需要多大的服务器容量才能实现整个区的服务器全覆盖? 这是一个技术难点。
其次,玩家之间需要网络通信,这涉及到很多问题。 网络通信是TCP协议还是UDP协议? 开发者花了半年时间开发一款网络游戏,却发现还是很卡。 网络游戏如何在网络波动、抖动的情况下让游戏展现出流畅的效果,在技术上是非常困难的。
三是部署和运维。 战斗游戏,尤其是房间游戏,是有状态的。 例如,如果有4个人加入这个房间,那么这4个人会同时在一台服务器上进行战斗。 他们不能分布在多个服务器上进行战斗。 如果他们分布在多个服务器上作战,他们可能会连接数据库并降低效率。 尤其是当很多人频繁操作数据库时,数据库的性能可能会出现异常。
战斗游戏的制作并不容易,而且非常困难。 而小游戏在线对战引擎(MGOBE)则一一解决了网络游戏背后的技术和操作难题。 开发者只需调用几个JS接口,5分钟内即可完成游戏。 无需复杂的后台代码即可实现房间管理、在线匹配、在线对战等功能。
很多开发者都有疑问。 无论是房间管理还是在线匹配,都是API调用。 如果我有自己的逻辑,想写一些特殊的逻辑怎么办? 迷你游戏在线战斗引擎有房间扩展。 每次开发者在房间调用API时,引擎都会触发自定义逻辑脚本。 开发者可以在此脚本中编写自己的代码。 这种情况下,一个技术栈就可以完成前端和后端的能力。 即使包括断开连接的场景,开发人员也可以编写自定义的服务逻辑。 例如,如果玩家断开连接,您可以让他游戏失败或将他从房间中移除。 您可以在房间扩展中编写自己的逻辑。 一些特殊的逻辑。
刚才讲的是如何组织玩家,以及玩家之间如何进行线上交流。 这里有三种模式:
1、客户端直接按需发送消息给另一个客户端;
2. 帧同步
其中,张小花以《王者荣耀》为例,讲解了帧同步的原理。 在游戏中,客户端会将玩家的动作指令发布到后端,但后端不会立即将其传输给其他客户端。 相反,它会将所有客户端传输给它的消息以一定的频率同步到每个客户端。 客户端,每个客户端都有其他客户端的逻辑。 所以这个时候开发就会像单机游戏一样。 服务器会有一定的渲染量。 如果用户实时同步游戏开发制作流程,客户端将继续渲染。 对于这种定时客户端,客户端渲染的频率也是固定的,不会乱。 这样才能达到更高的开发效率。
尽管如此,帧同步仍然存在一些缺点,如网络要求高、抗插拔能力弱、断线恢复时间较长等。 由于它的帧同步是渲染,如果渲染断开,就会从第一帧渲染到当前帧。 如果游戏之前进行了 5 分钟,则可能需要 5 分钟才能重新渲染。 当然,mgobe已经解决了这个问题。 另外,由于客户端的服务器,无论是手机还是电脑,都含有浮点数,所以每台电脑生成的浮点数都是不同的。 这时根据浮点数渲染的结果会导致每个客户端的结果不同。 。
3、状态同步
使用帧同步的游戏并不多,主要是小型战场上的实时游戏。 大多数游戏都使用状态同步。 状态同步具有很强的反作弊能力。 可以应对大事件、大战场,比如吃鸡游戏。 至于状态同步,断开和恢复的时间也很短,因为每次保存一个状态,网络环境相对宽松,但是开发效率比较慢,因为在服务器端写一次可能会有类似的情况逻辑到客户端。 。 mgobe 支持状态同步。 开发者只需编写逻辑,无需关注部署。
结论
据第三方机构报告,2019年小游戏市场规模或将达到250亿元,其生态系统也在不断成熟。 小程序·云开发将不断丰富SDK能力,释放腾讯的技术价值,并逐步支持多种开发语言,让开发更加便捷。 未来,新技术会层出不穷,但我们要知道,技术永远是为人服务的。 如果不解决人们的问题,技术就无法发展和繁荣。 解放开发者的精力,让他们投入到业务逻辑等更有价值的工作中,从根本上赋能技术发展,才是推动行业“轮子”前进的动力。