后端小白做网游开发心得分享 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
LeanCloud
V2EX    程序员

后端小白做网游开发心得分享

  •  
  •   LeanCloud 2017-12-05 11:56:59 +08:00 3092 次点击
    这是一个创建于 2934 天前的主题,其中的信息可能已经有所发展或是发生改变。

    [ 玩转 LeanCloud ] 开发者投稿分享:

    作者:赵天泽

    作为一个通过 LeanCloud 入门后端开发的小白,一年多的开发历程让我收获满满。多个项目也在 LeanCloud 可靠的服务支撑下取得了不错的发展,其中用户量最大的项目的云引擎每分钟请求量在 1.2W 次左右,每日调用存储服务 API 在 300W+ 次。在此过程中,我不仅得到了 LeanCloud 各路技术大侠的指点,得以提高数据可靠性并优化了逻辑执行效率,而且 LeanCloud 的高可用性和对突发异常处理的高效也让我对运维工作和服务稳定性没有丝毫的顾虑;再加上简洁好用、响应及时的工单系统,可以这么说,我的工作由此变得美好惬意。

    海外节点+高效技术支持

    其实使用 LeanCloud 之前,我一直在做 iOS 应用和手游客户端开发,没有半点后端开发的经验,也未曾碰过 Javascript,直到后来参与过几款网游的开发,才对游戏后端大概的架构和接口设计有所了解。接着我们的项目需要为单机游戏增加网络存档和每日任务分发功能,可我们一位后端程序员也没有,而且也不具备从头搭建和部署一套可靠的后台服务的能力,所以可行的方案就是找到一套现成的第三方服务。当时国内国外也有不少的后端服务提供商,最终敲定 LeanCloud 主要是考虑到:

    成熟稳定的海外节点和配套服务。我们的游戏主要是在海外推广,虽然海外有不少专门针对游戏的后端云服务,但是实际使用下来发现它们的开发自由度并不高,达不到我们的标准。

    与技术支持人员的沟通效率。大多的海外服务商只能通过邮件或者论坛沟通,效率十分低下,真要是遇到了问题迟迟不能解决就会非常麻烦。而 LeanCloud 技术支持的响应非常之快,即使最初大家只在 QQ 群里沟通还没有使用工单系统,所有回复都不拖沓,使用者当然高兴啦。

    清晰详实的技术文档。分类比较清晰,非常适合入门学习。

    另外,我们还特地调研了 LeanCloud 的云引擎服务,因为其提供完整简便的后台部署途径和工具,实现线上环境的一键部署,又能让我们基于 express 任性地开发后台逻辑,所以我们确信选择是非常正确的。

    REST API + 云函数是万金油

    为实现用户游戏数据存储和每日任务分发,我们最先用了存储服务和云引擎。不过我们并没有用 LeanCloud 提供的 SDK 来直接调用存储服务,而是选择用 LeanCloud REST API 调用云引擎里面的云函数,然后通过云函数调用存储服务来实现相应的逻辑。这样做的原因是我们的游戏主要是使用 lua + C++ 开发,LeanCloud 的 C++ SDK 没有持续维护,使用起来会有潜在风险;而如果使用 iOS 和 Android SDK,又得把需要使用的接口暴露给脚本层,这就多了一道不必要的程序。基于以往开发网游的经验,我们更倾向于按功能模块向前端提供相关的 API,让前端通过 HTTP 协议将数据 post 给服务器,服务器处理完后返回前端需要更新的那部分数据就好。

    实践下来我们发现这样做的确有优势,把数据查询、处理和存储的逻辑放在后端进行,这样业务的调整可以变得非常灵活。比如在用户量起来之后,发现每日任务表会有大量的读写操作,根据 LeanCloud 技术支持的建议,我们将一些热数据放到云引擎的缓存服务 LeanCache 中使用,也就是先去缓存里面查数据,没有的话再去存储服务里面查,这样就有效地降低了查询的时间,提高了业务处理的效率,而前端代码啥都不用变。

    云缓存速度快得没商量

    要单独说一下云缓存 LeanCache。它实质上就是 Redis,对于改善和提升我们项目性能功不可没。当初我们需要做一个全区排行榜,正好 LeanCache 的官方 Demo 中提供了排行榜的示例代码(帮我补上了什么是原子性这一课,必须膜拜),于是我们在此基础上实现了自己的排行榜功能,并把它放在 npm 上方便大家取用「 leaderboard-promise 」。接着我们还陆续在云缓存中实现了热数据缓存、订单系统、token 验证系统等等功能,充分去利用 Redis 的优势来解决业务中可能引起性能瓶颈的情况。

    跨时区定时推送通知

    我们的用户来自全球各地,有不同的时区,我们需要让所有用户在当地时间的下午 7 点收到一条通知。通过云引擎和消息推送服务,我们只需要在每个 installation 对象下新增一个用户的时区数据,然后在云引擎中设置一个每个整点触发的定时任务,当任务触发时在推送条件里面设置对应的时区信息,这样就达到了我们的目的。另外通过云引擎实现向特定用户群推送也非常方便。

    实时对战玩法 500 行代码搞定

    最近我们的新项目希望能够尽快实现可靠的房间制实时对战玩法,以便能够快速投放到市场去验证玩法是否受到玩家欢迎。如果在用户认可之前就耗时耗力去开发一套实时对战框架显然不太明智。于是我们向 LeanCloud 求助,竟然很快地得到了一套基于实时通信模块的开发建议,这样通过云引擎搭配实时通信模块,用了不到 500 行代码就把一套房间匹配制的实时对战框架搭建完毕,后续只需要集合项目中游戏的实际玩法就可以很快部署上线了。原以为要洪荒之力,却只费了吹灰之力,幸福感那是瞬间爆棚。

    技术课程直播完善

    LeanCloud 一直坚持在做的直播课程系列。所有课程不仅涉及到了 LeanCloud 各个功能的基本使用介绍,还讲解了后端开发中常常需要去面对的问题,像如何对压力评估和优化、如何设计业务流程来保证数据的一致性、如何通过权限控制保障数据的安全。这些内容对于即使不使用 LeanCloud 服务的后端开发人员都是十分有用的。

    最后,我想把 LeanCloud 推荐给两类人:

    想学习后端开发,但是却被复杂的云服务器采购、架设和配置吓住的同学。LeanCloud 有非常高效的开发配套工具,可以快速在本地和云端实现需要的业务逻辑。看着自己的项目上线运转起来的成就感一定会激励你继续深入的学习,以 LeanCloud 为起点,慢慢的完善的后端开发知识体系。

    另外一种就是虽然有足够的后端开发经验、但目前着手于初创项目并没有完善的运维团队支持的同学。众所周知,要建立起一套完善的运维保障体系是一件需要投入不少资源的事情,初创项目应该把更多的精力投入到实际的业务逻辑开发上面,运维这样的麻烦事儿就完全可以交给后端服务商吧。

    bramblex
        1
    bramblex  
       2017-12-05 12:11:17 +08:00   1
    实时对战 500 行……这想的太美了……

    为了实时,我们连 linux 都是打补丁的,网络层还是自实现的 kcp。才解决了复杂网络环境下的低延迟,尤其是 4G 环境下丢包很高,然而我们依然能保持很低的延迟。
    misaka19000
        2
    misaka19000  
       2017-12-05 12:17:36 +08:00 via Android
    咋感觉没啥干货啊
    AsisA
        3
    AsisA  
       2017-12-05 12:21:38 +08:00 via Android
    广告应该发到推广节点的吧
    Rice
        4
    Rice  
       2017-12-05 12:31:50 +08:00 via Android
    没有干货
    shuizhengqi
        5
    shuizhengqi  
       2017-12-05 14:04:36 +08:00
    又是一次广告,直接 block
    moxiaonai
        6
    moxiaonai  
       2017-12-05 15:22:04 +08:00 via Android
    这广告打的太明显了吧
    YMB
        7
    YMB  
       2017-12-05 15:38:04 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     891 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 21:29 PVG 05:29 LAX 13:29 JFK 16:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86