最近公司开发了一个捕鱼游戏,现在想要把这个项目嵌入到公司已有的游戏中,成为其子游戏,开发捕鱼的服务器框架是基于 skynet 的框架(独立一套系统)。而已有的游戏服务器框架是c++自研框架(也是独立的一套系统),所以需要解决一个问题:就是两个系统中数据共享的问题,因为用户都是现有游戏中的。捕鱼并没有用户,用户从主游戏中进入到捕鱼势必要把 ta 的金币、钻石、道具等数据带到捕鱼服务器,最终用户退出捕鱼游戏,要把用户现在的金币和其他数据移动回去,这里就涉及到数据共享和维护数据唯一性的问题了。
最初的方案是选择 http 请求通知的方式进行通信。但是考虑到极端情况: 如高并发,如果一秒钟发起 2W 次请求那么以 http 的处理方式就是要 每秒建立tcp链接和断开链接 * 2W次,文件描述符占用、和不能便捷集成到两个系统业务层中、以及网络异常处理需要依赖到DB保存数据待后续恢复、以及后续的集群部署需要再做考虑,等等这些缺点都是无法忍受的。
后面考虑用 redis 的 Pub/Sub 来实现高效的 MQ 并且在请求发起的时候如果超时,如果数据是必须被对方接收的话,还可以直接把数据写入缓存,让对端自行获取。遂和其他 xxMQ 进行对比,最后不管从易用性、通用性、高可用等等方面上都是 redis 胜出,当然 redis 的 Pub/Sub 也是有缺点的,但是使用到上述的这个应用场景来说,都是可以忽略的。
数据一致性保证机制
如果发起端请求对端超时 会将请求的数据写入到缓存,其格式如下:
保存到 redis 中的类型:set
key: 捕鱼缩写(f) + "_" + 用户uid
value: "请求的命令 "+" @ " + [ k + "|" + value [ k + "|" + value ...] ]
实例 key = f_10001 value = req_mv_gold@gold=10000|session=1
含义为:捕鱼发起的请求(f) 用户uid(10001) 命令(req_mv_gold)和携带数据用 "@" 分割,数据中字段与字段用 "|" 进行分割。数据解析,按对应命令协议定义结构进行解析。
1.用户登录了捕鱼,进入捕鱼游戏,用户向斗地主发起请求 req_mv_gold 数据中 gold 字段值为 0,斗地主就把用户的金币先保存到临时变量,然后置空用户的金币,再把用户金币通过 rsp_mv_gold 发送给捕鱼,如果 rsp_mv_gold 没有收到响应,斗地主要把钱加回给用户,意味这一次转移金币失败
2.假如用户已经成功完成了上面的步骤,此时用户在斗地主中的金币值为 0,在捕鱼中的金币值为用户实际金币值。
3.等用户退出捕鱼游戏就再次向斗地主发起第一个步骤的请求,如果成功,则完成了金币转移,如果失败(可能斗地主服务器中,这个用户下线了,可能斗地主奔溃了,可能网络阻塞或者掉线),捕鱼会把这次的请求写入到 redis 中,也就是上面的这个例子。
4.用户再次登录斗地主时,斗地主服务器需要去redis中查看是否有 捕鱼缩写(f) + " " + 用户uid 的这个健的存在,如果存在了,就要读取该键全部的成员
如:SMEMBERS f_10001,(理论上来说,每种请求最多一条记录)并且删除掉 redis中的 捕鱼缩写(f)+" "+uid 的健 如:DEL f_10001。并且按具体内容恢复数据。
这个机制适用于全部需要确保对端收到的命令。如果对端是捕鱼,那么 set 的键是 斗地主缩写(d) + "_" + uid,表示斗地主发起的请求失败了,捕鱼会按上面的流程自行处理。
网络捕鱼是设计好的程序。捕鱼游戏起源于街头巷尾的游戏厅,后成为网络游戏,通过诱导玩家下载捕鱼游戏,并通过事先设置好的程序暗箱操作,吸引大量用户充值,如今捕鱼游戏努力与赌博红线保持距离,遵守不能提现、不能交易等规定。捕鱼达人3与前两部相比,技术上有哪些突破和创新?捕鱼达人3作为前两代成功作品的续作,我们需要从玩法到技术,全面超越前代。所以在技术上,我们主要做了下面一些突破和创新:
1)鱼的3D渲染。 跟2D渲染相比,3D渲染可以让鱼看起来更加立体和真实。 3D骨骼动画可以让动作更加丰富和平滑。另外我们还为鱼增加了表情动作,让鱼儿更具个性化。
2) 纯3D路径。 前两代的2D路径在我们新的3D场景下,表现力要弱很多。为此我们设计了全新的3D路径编辑器,鱼的游动不仅仅在一个面上游动,而是一个立体空间,这样鱼的游动过程会更加平滑和真实。
3) 丰富的武器表现效果。 以前的武器效果,我们一般是结合帧动画和粒子效果实现,在捕鱼3中,我们的武器很多是通过 shader 实现的,让效果更加绚丽和富于变化。比如闪电武器,泡泡武器等。
4) 3D的后处理和灯照效果。大家可以看到我首屏模拟海洋的效果,就用到相关技术。还有鱼身上的波光效果。
2.《捕鱼达人3》使用了最新的Cocos2d-x中3D功能,它有哪些突出的亮点?请举几个游戏里的具体案例说明
1)继承Cocos2d-x的设计思路,只要具备Cocos2d-x的编程经验, 在使用和理解上完全无障碍,可以立马上手写代码。
2) 丰富的材质系统,可以自定义模型不同渲染效果。 比如:我们的鱼身上的渲染效果已经电鳗鱼的闪电效果
3) 强大的模型编辑器,可以自定义模型的材质
3. 引擎3D功能使用的时候感觉和2D部分区别在哪?
设计理念和开发流程和2D差不多
4. 游戏里面的动画效果,是UI实现的,还是Cocos引擎的3D效果?比如那个漩涡,是不是使用引擎的3D效果可以做很多不同的漂亮效果呢?
渲染时用3D的材质系统实现的, 由于材质系统的扩展能力很强,做出各种漂亮的效果完全没问题。
5. Cocos2d-x的3D技术稳定性如何?是否已经到了可以大规模市场化应用的阶段?
挺好的,我们Android版本的适配度高达92%以上。
6. 引擎粒子效果的效率一直备受争议,请问捕鱼达人3有没有专门做优化?
我们对同一种粒子做了批次处理。另外,还通过脚本, 严格控制了粒子的个数,不能超过某个上限值。
7. 在《捕鱼达人3》开发过程中,遇到哪些困难和挑战?你们是如何克服的?
游戏开发都会面临一个资源的管理问题,就是资源如何从美术制作,在到程序使用以及后续的维护。捕鱼3的资源类型比较多。2D层有图片,ui资源,动画资源,字体资源,粒子资源。 3D层又涉及3D模型,材质,纹理,shader等。另外,还有track,策划配置文件等。所以种类非常多。 还因为捕鱼3的适配性要求比较高,所以,我们有些资源按照分辨率有划分了几大类。 还附加一条,资源还分不同的语言版本。 上线之后,资源本身还需要跟随发布版本一起维护。所以中间的问题非常多。 在我们项目中会严格对资源进行规范, 包括命名,目录结构。资源如何从美术维护的目录流动到程序使用的目录等。另外还维护了一套基于ant+python的脚本来去驱动资源的流转。 实现一键生成程序所需要的资源。 无须人工的干预, 非常便捷。
另外我们还有一键打Windows,iOS,Android各种程序包的脚本,方便做版本的daily build。
8. 《捕鱼达人3》的背后一定有一支强大的团队,包括多方面能力的配合,能否分享一下团队协作和管理的经验?
就我们研发而言, 其实最重要是前期做好开发规范,然后打造融洽的团队氛围,明确每个人的开发任务,大家随着项目的发展一起往前进步。
9. 最后,对其它有志进入手游行业或者在摸索中前行的手游开发者,您能否给一些建议?
虽然很多媒体都在高喊:手游已是一片红海。 但这个市场远没有饱和,移动设备的增量仍然很大。而且区别于端游市场的客户端大作,页游市场的各种网游。手游的游戏类型更加多样化,更加丰富。休闲的,棋牌的,各类网游,都有成功的案例。所以,这个市场更加灵活,更适合小团队创造奇迹,仍然有很多的机会。另外从技术上讲,由于存在Cocos2d-x这种几乎处于垄断地位的引擎, 手游也是一个更加开放的市场。 网上有一大堆的学习资料和游戏源码, 只要你有点计算机基础,入门还是很容易的。重要的是自己能够静下心来多看多写些代码,争取独立发布一款产品。我见过不少人自己做一点东西都没坚持下来,做一半就放弃掉。其实在多坚持下,离成功就近了很多。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)