Tars批量发布的轮子

Tars的开源Web管理没有提供SET区域层级批量发布的功能(内部版本里面我记得有),提了Issue(https://github.com/TarsCloud/TarsWeb/issues/13)也没回馈。想想自己也算对Tars熟悉,于是便挽起袖子造轮子。

需求比较明确,在上面的Issue里面也说的比较清楚:对一个app众多set里的同一server服务进行发布更新。

最终实现:https://github.com/lanyutc/TarsBatchPatch

Read More →

努力与选择

(全文谨代表个人观点)

毕业后进入了一家几百人的游戏公司做开发工作,当时满心欢喜,原因有三:钱够,游戏行业,离女朋友近。进入公司后,并不是965或者996工作时长,而是周一、二10:00~19:00(开发功能),周三10:00~24:00(开发+测试),周四11:00~周五1:00-13:00(改BUG+发版本),通宵是常事,周六周日很少加班

开始的1年我成长很快,一方面是有高人指点,一方面是自己的努力,有时能搞定别人搞定不了的事情,或者提出更加合理的实施方案。那会比较年轻,对于“每周通宵一次”丝毫没在意,更何况当时的游戏DAU高峰有50W,月流水高峰有400W,一片欣欣向荣(现在回过头来看已经是我职业生涯所处项目的巅峰了!)。过了一年半慢慢意识到“通宵”的伤身,但是公司的制度无法改变(周四发版本),最终选择和组员商量轮班:第一周周四A、B晚11点回去,C、D留守发版本,周五A、B早些过来处理线上问题,第二周轮换

轮班对个人要求更高,引发一个显著的问题是:因为你需要熟悉别人的代码,可能还需要替别人改BUG,耗时更长导致延长发版本的时间;但这样做明显的好处是从“每周通宵一次”变成了“二周通宵一次”,身体上更吃得消,同时每个组员都对系统更加熟悉,减少后续BUG产生的几率。但是“通宵”肯定不是长久之计,于是我在毕业2年半之际跳到了大厂,也与我的职业规划相符。

到了大厂之后,工作时长变成了10106,如果遇到版本节点会更晚一些,基本没有通宵。大厂内部论坛活跃,有各种技术心得共享,工作空闲之余逛论坛会发现:这个问题还可以用这种方法;这个方案好,以后做XX的时候应该可以用到的感悟。在大厂,身边的大牛更多,遇见棘手问题/大型模块他们会给出建议然后进行组内讨论,从讨论中学到了很多方法论与技巧。总之,入职前3个月应该是我在大厂成长最快的时候。

虽然大家都很努力,保持10106的工作强度,但是项目最终还是没有成功上线,团队的努力付之东流。从个人努力成长来看与大牛交流和论坛分享给予了我很大的帮助,在一些问题处理的方法论上有了极大的提高。

Read More →

网游自动开服方案

网游自动开服不是什么有难度的技术,严格来说只能算是一个业务需求。这篇文章会介绍一种自动开服的方案,梳理清楚实现逻辑以及相关的注意点。

写在前面

虽然把方案形容成“自动”,但并非是我们想象中的流程:服务器自动购买/部署->新服运行->玩家进入,而是在服务器自动购买/部署这一步做了一些妥协。

为什么?

Read More →

2018年小游戏开发总结

这其实是一篇个人的2018年度总结。

整个2018年我基本都投身到小游戏的开发制作当中,游戏先后上线了微信小游戏QQ空间小游戏,同时预开发了厘米游戏版本。所以这篇总结我会站在开发的角度谈一谈在这三个平台开发的经验,以及趟过的坑。

上述的三个平台分别对应微信平台,QQ空间平台,手Q平台,对于详细介绍这里就不累述了,相信网上的很多文章肯定比我介绍的好。

Read More →

libcurl内存泄漏排查

由于一些第三方平台/服务的API都升级成了Https,导致原来Tars自带的Http库无法直接使用了,于是引进了libcurlgithub地址)。

但是发现在对应模块长时间运行后,其占用内存一直稳定上升,存在内存泄漏。首先排除掉一些不太可能的泄漏点:Tars、std::string、std::map、std::vector常规使用,无显式的new/malloc。

那么只剩下模块引入的动态库libcurl了,而程序实现严格按照libcurl按照官方文档的样例做法:

  1. 在主线程curl_global_init;
  2. 业务线程每次进行业务处理时调用curl_easy_init获得新的CURL,设置好选项后调用curl_easy_perform;
  3. 业务处理完毕后调用curl_easy_cleanup,curl_slist_free_all(如果有用到curl_slist)释放资源;
  4. 如果主线程退出调用curl_global_cleanup释放资源;

开始一度以为是libcurl用法有问题,后来用valgrind跑程序发现是libcurl真有泄漏,github上1W+Star的开源库有泄漏,这是什么操作?

Read More →

游戏上线前服务器应该如何测试

又一款游戏项目上线测试了,深刻体会到服务端在上线前的这段日子是比较“难熬”的。因为除了原有的开发任务,还有大量的第三方接口支持、统计支持、日志分析需求等,以及服务器各种测试和后续测试BUG的排除。其中测试关系到后续服务器能否满足要求稳定运行,马虎不得。

写这篇文章的目的主要是记录一下上线前服务器测试的个人经验,如果觉得内容有不妥或者遗漏的地方欢迎交流。

测试目的

测试不是盲目的,不要为了应付而测试。简单来说测试有以下目的:

  • 检测是否满足运营/商务需求;怎么理解?比如游戏上线第一天通过平台/渠道买10W的量,可以假设这10W的量在1个小时之内进来,那么登录/创角大概在1666次/秒,系统能否正常承载?
  • 高压力下发现系统瓶颈;
  • 高压力下发现功能BUG;
  • 得到系统承载数据,为后面可能存在的重构做数据支持;
  • 需要发报告,为了应付;

Read More →

Tars网络包处理过程分析

很早就想写一篇关于Tars网络包处理的文章,但是又不知道从何写起,因为心里想着无非就是基于Linux Epoll的那一套东西,加上一些线程间的数据交互。

直到遇见了BUG!

这不是Tars框架本身的BUG,只是使用者在没有吃透Tars包处理运作机制情况下发生的BUG。

本文会围绕这个BUG从头到尾来谈谈Tars对网络包处理。

(文章不会贴出整段代码,会以代码片段+说明的形式展开,源码:https://github.com/Tencent/Tars,版本:5237058b91c5350be881205249f196970c503614,Date: Tue Jun 19 20:56:02 2018 +0800)

Read More →

[译文]OpenAI Five

原文链接  –  OpenAI Five

我们由五位神经元网络组成的队伍,OpenAI Five,已经开始在DOTA2中击败非职业队伍。虽然现在还有一些约束(译者注:功能不完善,文末有说明),我们的目标是在8月的TI8比赛上使用限定的英雄池击败最顶级的职业队伍。我们可能不会成功:因为DOTA2是现在世界上最流行、最复杂的电子竞技之一,拥有着富有创造力和积极态度的职业选手,他们一整年的进行训练为了在DOTA每年近四千万刀的奖金池里分一杯羹(世界上奖金池最高的电子竞技)。

OpenAI Five每天通过自我对抗的训练数据等值于正常游戏时间180年。训练使用大规模版本的Proximal Policy Optimization,运行在256个GPU和128000个CPU核心上 – 相当于去年TI7上AI Solo比赛使用的大规模版本。他对每个英雄配置非人类玩家数据,通过LSTM学习到了非常明显的游戏策略。这表明了强化学习通过大量且能完成的计算量可以实现长期训练 – 并不需要对训练、学习算法有突破进展,这和我们在开始这个项目时的估计相反。

为了测试我们的进展,我们会在2018年7月28号与顶尖玩家举行一场比赛,你可以在Twitch上在线观看或者申请成为挑战者。

Read More →

Tars服务监控与特性监控

Tars框架自带服务监控(stat)与特性监控(property)的功能,入口在如下图:

(直接点会是空白,你得先点开你的一个Server才会出现曲线图)

依靠监控功能,你可以快速的定位问题,观察接口的使用状态,进程运行状态,甚至自定义观察数据直观的在Tars管理页面上显示出来。

你可以自行做二次开发,利用入库数据做成自己的短信告警机制。总之就是数据在,想怎么围绕展开都行。

Read More →

如何管理UE4 Server

以下内容都是基于Unreal Engine版本:4.18.2-0+++UE4+Release-4.18。

操作系统是:Window10 x64专业版。

编译工具:VS2017 企业版。

承接上一篇文章UE4 ShooterGame Server研究最后遗留的内容,这篇文章主要是讲一讲对UE4控制服务器(后文简称ControlSvr)的思考实现。

Read More →