当前位置
主页 > 新闻中心 > 公司新闻 >
Cocos 技术派|实时竞技小游戏技术实现分享
2021-06-15 20:36
本文摘要:在前阵子举行的 Cocos 开发者沙龙上,来自中原乐游 BigRoad 事情室的客户端主程李清,为现场开发者分享了其团队制作的实时竞技小游戏《守卫豆豆-欢喜枪战》的技术实现方案,深受开发者喜爱。在征得中原乐游的同意后,技术派专栏将通过本文对李清的演讲举行梳理总结,把他们名贵的技术履历分享给因为种种原因没能去到沙龙现场的开发者同伴们!李清关于中原乐游北京中原乐游科技股份有限公司是一家专注于游戏研发与刊行、泛娱乐IP打造和谋划的创意文化企业。

od体育官网

在前阵子举行的 Cocos 开发者沙龙上,来自中原乐游 BigRoad 事情室的客户端主程李清,为现场开发者分享了其团队制作的实时竞技小游戏《守卫豆豆-欢喜枪战》的技术实现方案,深受开发者喜爱。在征得中原乐游的同意后,技术派专栏将通过本文对李清的演讲举行梳理总结,把他们名贵的技术履历分享给因为种种原因没能去到沙龙现场的开发者同伴们!李清关于中原乐游北京中原乐游科技股份有限公司是一家专注于游戏研发与刊行、泛娱乐IP打造和谋划的创意文化企业。代表作品《奔跑吧-撕名牌大战》3、4、5系列,《极速前进-狂野飞车》、《星河战神》。现在聚焦于以 H5 为代表的无端和轻端游戏,先后研发和刊行了《欢喜消消消》、《守卫豆豆-欢喜枪战》、《全民小镇》等微信小游戏,同时多款游戏上线微信小游戏精品平台。

中原拉乐游游戏简介《守卫豆豆-欢喜枪战》是一款基于 Cocos 引擎研发的休闲射击乱斗小游戏,融合了射击、MOBA、吃鸡等热门玩法。游戏截图游戏特点:萌宠射击,实时竞技四人乱斗,双人组队多个英雄,身怀特技本文主要从三个方面来举行分享,划分是:ECS 架构网络同步机制技术难点及解决方案一、ECS架构1、ECS 架构目的:降低不停增长的代码库的庞大度。2、游戏原型需求:子弹:移动、碰撞英雄:移动、碰撞、发射子弹炮台:发射子弹3、传统架构的毛病要实现游戏原型,根据我们之前的做法,是用一个类来实现一种游戏实体的所有功效,这个类既有状态,又有行为。代码复用使用继续来解决。

如果用这种做法,那么类或许长这个样子:类图大家可以看到,父类会有许多共享的属性和方法,子类继续父类去做详细的事情。可是这种做法有许多毛病,好比说,随着项目规模的增长,代码库庞大度也不停增长,父类会越来越庞大,子类的功效越来越不明确,与多个类相关的代码你不能太确切知道应该放在那里,拓展功效的时候极其不灵活,如果后期需要增加新功效的话,我们需要对整个继续树举行功效重构才气使其比力合理。在履历过几个项目之后,我们转头反思,发现之前的做法,违反了许多面向工具设计原则。

好比说:单一责任原则(Single responsibility principle)每个类都应该只有单一的功效,而且该功效应该由这个类完全封装起来。组合重用原则(Composite Reuse Principle)默认情况下应当使用组合,只有在必须时才使用继续。在总结了从前的项目履历,并参考了大量技术文章后,我们找到了一种架构,把大量的模块举行拆剖析耦,然后再集成起来,这就是我们接下来要先容的 ECS 架构。

4、ECS架构ECS 划分是:Entity(实体)Component(组件)System(系统)看到实体和组件大家可能以为比力熟悉,可是这里要注意,这跟我们引擎中的实体组件框架可不是一回事,接下来我为大家简朴先容一下 ECS 架构的元素。(1)ECS 架构元素:Component:组件,存储游戏状态Entity:实体,组件的荟萃System:系统,实现游戏行为World:系统和实体的荟萃,就是我们的游戏世界,他们的关系或许是这个样子的:我们可以看到,游戏世界中有许多 System,每个 System 卖力实现一种游戏行为,同时有许多组件,每种组件中会有一些游戏状态,实体上可以挂载一个或多个组件,实体和 System 聚合成了我们的游戏世界。(2)ECS 架构设计:这个架构有个基础原则:组件只有状态,没有行为系统只有行为,没有状态刚看到这个原则的时候,大家可能会有一些疑问,什么是游戏行为呢?游戏行为,其实就是凭据一定的规则去修改游戏状态。

好比说移动,就是凭据实体的偏向和移动速度去改变这个实体的位置。如果系统没有游戏状态,它如何去实现游戏行为呢?这就是 ECS 架构最重要的职责了:为系统筛选出它体贴的实体子集,只展示给它体贴的游戏状态。详细我们是怎么做的呢?首先把可能单独使用的游戏状态归纳为一个个组件:好比最常见的位置、偏向我们可以归纳为变换组件;移动速度这个组件可能会在移动系统中单独使用,所以我们把它归纳到移动组件中;碰撞组件则有碰撞盒的巨细;攻击组件有攻击偏向,这样我们就把种种属性给拆开了。接着,我们在系统实现的时候,要向框架声明我体贴哪些“组件元组”(Component Tuple)什么是“组件元组”?还是举刚刚移动的例子。

移动系统的移动行为,应该是体贴实体的位置、偏向以及移动速度,就是我们归纳的变换组件和移动组件,那么只要一个实体同时挂载这 2 个组件,它就可以被移动系统遍历到,系统就会举行操作从而实现移动行为。最关键的一点,“组件元组”其实就是用来实现框架筛选实体的功效,实体只需要凭据自身功效需求挂载相应的组件元组就可以了。好比说子弹它有移动和碰撞的功效,那么就挂载上变换、移动和碰撞这 3 个组件。

最终实现的效果就是移动系统遍历了英雄和子弹实体,在他们身上实现了移动的行为。攻击系统遍历了英雄和炮台实体,然后他们就可以发射子弹。(3)ECS 架构实例:接下来,我们看一下比力庞大的碰撞逻辑,这里我们可以对碰撞举行拆解:首先是碰撞的触发系统。

当碰撞发生时将发生一个碰撞事件,然后这个系统只干这件事。剩下的碰撞处置惩罚呢,对于子弹来说,会有一个碰撞后销毁系统,它会在碰撞之后把子弹销毁。

对于英雄来说,他有一个碰撞后的损血系统,通过这种方式,我们就可以把碰撞举行拆分,再通过刚刚的方式集成在一起。(4)ECS 架构作用:这种架构可以让每个开发人员卖力差别模块的开发,有效地提高多人开发效率。最重要的就是模块的复用,可以便于功效拓展。如果你想改变一个实体的功效,只需要添加或者移除实体的组件就可以了。

好比说:一个英雄死亡之后,他应该失去移动功效,那么在英雄死亡之后,我们只需要把移动组件给移除就可以了,等他复生的时候再给他加回来。可以看到,这种方式很是利便。既然这么利便了,我们就可以做出一个编辑器,把这种能力开放给筹谋人员。实际上,暴雪就专门为 Overwatch 开发了一套 Statescript 的剧本语言,它用起来就是一个可视化的编辑器,筹谋人员可以在这个编辑器中编辑每个英雄在种种游戏状态中拥有什么游戏能力,法式只要实现详细的功效模块,然后开放给筹谋人员使用,很是地灵活。

以下是我们在实践历程中参考的技术文章:[参考文档]《守望先锋》架构设计与网络同步http://gad.qq.com/article/detail/28682《守望先锋》回放技术-阵亡镜头、全场最佳和亮眼体现http://gad.qq.com/article/detail/29595《守望先锋》中的网络剧本化的武器和技术系统http://gad.qq.com/article/detail/28219浅谈《守望先锋》中的 ECS 构架https://blog.codingnow.com/2017/06/overwatch_ecs.html二、网络同步机制1、常见同步机制:常见的网络同步机制可以分为以下三种:确定性帧同步(Deterministic lockstep)快照插值(Snapshot interpolation)状态同步(State synchronization)(1)确定性帧同步服务端:收集并转发玩家输入数据,不运算游戏逻辑客户端:在玩家输入数据以后各自运算游戏逻辑优点:只有玩家输入会被传输,数据流量很是小;代码都是写在客户端上的,所以代码庞大度较低。缺点:对网络延迟要求很是高;每个机械浮点数运算纷歧致,需要将浮点数运算转换成整数运算;断线重连时间较长;因为游戏逻辑写在客户端,所以不是很宁静。

(2)快照插值服务端:运算游戏逻辑,将快照发送给客户端。快照,就是我这一帧所有游戏实体的游戏状态。客户端:不运算游戏逻辑,收到快照以后举行差值平滑播放。

实际上,客户端只是一个播放器。优点:客户端运算量小;断线重连容易实现;游戏逻辑全在服务端,所以很是宁静。

od体育

缺点:带宽占用很是大。所以这种方式之前多用于像 CS 这种局域网对战。

(3)状态同步服务端:运算游戏逻辑, 将玩家输入和部门状态发送给客户端客户端:在玩家输入时,不等服务器就立马运算游戏逻辑,就有点像单机游戏了,但这种运算效果未经由服务器,纷歧定是正确的,所以它实际上是一个游戏逻辑的预测。在收到服务器数据后,会对预测效果举行校验,如果错误,就需要平滑地将其纠正到正确的状态。

这里说一下校验的历程,其实就是先回滚再前滚。服务端下发的数据是之前一个时间点的数据,我们当地赋值以后相当于回滚到之前的时间,然后我们会一帧帧的运算到当前的时间,这就叫前滚,最后将盘算效果与预测效果举行比力,可以看到校验的盘算量是很是大的。

优点:客户端可以举行游戏逻辑预测;网络游戏体验好;以服务器数据为准,比力宁静。缺点:代码庞大度高;客户端运算量大;因为有客户端预测,所以客户端之间是不完全同步的。2、小游戏平台特点一开始我们的项目接纳的是状态同步的方式,但由于我们的项目是针对小游戏平台的,小游戏平台有以下几个特点:运算性能较差,客户端盘算量不能太大Javascript 代码很容易被破解,玩家想要作弊的话很容易网络毗连只能使用 TCP,所以带宽占用不能太高3、欢喜枪战的实现方案(1)带宽优化基于小游戏平台的特点,我们项目从状态同步开始做简化,一直简化到以下这种实现方案:服务端:运算游戏逻辑,将变化的状态发送给客户端客户端:不运算游戏逻辑,收到数据以后举行差值平滑播放优化了带宽占用的快照插值这个大家可能看着就有点眼熟了,其实就是优化了带宽占用的快照插值。

这种方案最关键的一点是,你要把带宽优化下来。而带宽优化最关键的,是只有在须要的情况好比游戏开始和断线重连时才发送全量状态,平时玩的历程中,只发送变化的状态。另外一方面是数据压缩,好比偏向,刚开始我们用的是偏向向量,但其实用弧度制乘以一千就可以了,这样就把两个 Float 优化成一个 Short。经由带宽优化结果:上行:2~15pkg/s,流量占用:0.1 KB/s下行:0~15pkg/s,流量占用:2.5 KB/s这个流量占用对于现在的手机网络来说,是完全可以接受的。

od体育官网

(2)网络发抖优化先容完了带宽优化,接下来我们来聊聊网络发抖。‍‍‍网络发抖指的是,网络的传输是不稳定的,服务端每个逻辑帧会发送一个包,它发送的频率是稳定的,可是对于客户端,可能在一个逻辑帧内收不到包,也可能收到多个包。这在游戏中的体现就是,玩家在移动历程中,这一帧没有收到包,就停下来了,下一帧收到 2 个包,就跳已往了,体现出走走停停的状态。

对于这种网络发抖,最常见的优化方法是航位推测法。航位推测法(Dead Reckoning):客户端和服务端约定至少每500ms同步一次客户端若没有定时收到移动状态,则用最后一次收到的移动状态继续预测一段时间服务端若没有定时收到玩家输入,则用最后一次收到的玩家输入继续运算一段时间用这种方案优化之后,走走停停的现象就基本没有了。

客户端流程图发抖缓存法另一种优化方案是发抖缓存,这是指收到包后不立马处置惩罚,而是放入发抖缓存中,延迟一段时间后再取出服务端流程图这种优化方案关键点在于缓存的巨细。如果缓存太小,对于发抖还是比力敏感,抗发抖效果比力弱,缓存太大,玩家的延迟又特别高,所以你需要凭据算法动态调整缓存的巨细以适应网络情况。(3)全区全服所有玩家都在同一个大区里前台服务器处置惩罚登录等战斗外逻辑游戏服务器处置惩罚战斗逻辑(4)分地域部署我们的项目是实时竞技游戏,对于延迟比力敏感,因此我们的游戏服务器接纳了分地域部署。服务器入口使用的是阿里云的“云剖析 DNS”服务,根据地域自动分配游戏服务器(华北、华东、华南、西南),玩家在举行快速匹配战斗时,会凭据地域分配服务器,同一地域玩家进入该地域所属服务器。

以下是我们在网络优化方面参考的文章,都是干货,如果感兴趣可以去相识一下。[参考资料]Networked Physics —— Glenn Fiedlerhttps://gafferongames.com/categories/networked-physics/《王者荣耀》技术总监复盘回炉历程http://gad.qq.com/article/detail/30902150ms流通体验 NBA2KOnline如何网络同步优化http://gad.qq.com/article/detail/10118三、技术难点以及解决方案1、Javascript 语言使用Cocos Creator上手很容易,不外 Javascript 语言很是灵活,需要统一代码规范。所以在项目初期,我们就制定了法式和资源规范,包罗代码花样、资源制作尺度等,而且会定期去整理代码和资源。

2、客户端性能优化性能优化这一块是我们比力头疼的问题。腾讯方面临于技术尺度要求很高,对加载时间、帧率、内存等都有卡死的严格限制,不通过技术评审则无法上线。

我们项目一开始用的是 Cocos Creator 1.9 版本,用尽毕生所学优化了好几轮,还是只能跑到 40 多帧。在项目快要上线之际,Cocos 推出了 2.0 Beta4 版本,我们就在上线前 2 周去升级了大版本,现在想想还是挺刺激的。升级之后,体验很流通,2.0 对于性能的提升是很是显着的。

iPhoneX 从 50 帧提升到 60 帧(iOS 机型)一加 5T 从 40 帧提升到 55 帧(安卓机型)OPPO Y55 与 iPhone6 稳定在 25-30 帧(老机型)3、自界说裁剪功效出于对效率的综合思量,Cocos Creator 2.0 移除了自动裁剪功效(cc.macro.ENABLE_CULLING),所以屏幕外的节点仍然会举行渲染,战斗中drawcall 较高。于是我们就自己实现了一套裁剪功效。当镜头或节点移动时判断节点是否需要举行渲染。修改了一部门 Cocos 源码,在渲染底层添加了一个自界说标志位用来跳过不需要渲染的节点,从而快速实现我们想要的功效。

4、Spine 换装实现整体换装:在《守卫豆豆-欢喜枪战》中,英雄是可以举行整体换肤的,可是 Spine 官方并不支持一套动画数据对应多套图片。所以我们便开始研究源码,研究后发现,使用 SkeletonTexture.setRealTexture() 设置为另一张图片资源就可以实现整体整体换装功效了。局部换装:《守卫豆豆-欢喜枪战》战斗中,英雄可以自由拾取武器,可是英雄与武器是两套动画文件,具有交织层叠关系,渲染时需要交织渲染。

这个功效 Spine 也是不支持的。在研究过源码之后,我们发现使用 Slot.setAttachment() 设置为另一个动画文件中的附件,就可以实现局部换装功效了。结语:Cocos 是开源的,所以大家在使用历程中,可以去多看看源码,都可以找到自己的解决方案。以上就是我今天带来的分享,谢谢列位!《守卫豆豆-欢喜枪战》很是谢谢李清带来的技术实现分享,《守卫豆豆-欢喜枪战》自上线微信小游戏精品平台后受到了宽大玩家的喜爱。

此前,中原乐游制作团队也曾接受 Cocos 的专访,分享项目的 2.0 升级之路。技术派,是 Cocos 全新推出的专栏,我们将不定期邀请知名的游戏制作者,为宽大开发者分享来自真实项目的实用的开发技术和实战履历。接待大家推荐想要学习的游戏产物和想要相识的技术知识,也诚邀有技术分享意愿的开发者联系我们噢~。


本文关键词:Cocos,技术,派,实时,od体育官网下载,竞技,小游戏,实现,分享

本文来源:od体育-www.shunqr.com

联系方式

电话:0377-922229398

传真:044-158902157

邮箱:admin@shunqr.com

地址:江苏省徐州市海南区蒂高大楼62号