前言
这本书讲什么
本书是基于C++与Lua语言开发游戏服务端的入门图书,内容涵盖Skynet引擎、C++底层开发、服务端架构设计等多个方面,全面展现网络游戏核心技术。
第一部分“学以致用”揭示了Skynet引擎的使用方法及注意事项,以《球球大作战》的案例贯穿这部分内容,全面又详尽地剖析服务端结构设计、通信协议格式、数据表结构设计、断线重连方案等众多核心技术。第二部分“入木三分”揭示了在多核时代采用现代C++编写多线程TCP网络服务器的高效做法,以C++重写Skynet的案例贯穿这部分内容,使用大量图表,生动翔实地描述Linux环境下的编程技术。第三部分“各个击破”列举了同步算法、热更新、防外挂等实际工程难题,并对其逐一击破,非常具有实用价值。
尽管本书以Skynet为例,但目的是探求服务端开发的一般性方法,因此它同样适用于使用C++自研引擎的项目组,甚至是选用Erlang、Golang、Java等语言的开发者。本书既可以作为大学计算机相关专业的指导教程,也可以作为游戏公司的培训材料,亦是独立游戏开发者的参考指南。
为什么写这本书
进入手游时代,服务端技术也在向前演进。现代游戏服务端既要承载数以万计的在线玩家,又要适应快速变化的市场需求,因此,如何设计合适的架构就成了重中之重。服务端技术并不简单,作为服务端新人,全面掌握服务端技术可能需要数年时间;作为游戏公司,培养员工的成本也不低。
新人或许有这样的经历,在请教资深技术人应该看什么资料学习C++服务端知识时,可能得到的答案是先把《TCP/IP详解》《UNIX环境高级编程》《数据库系统》这些大部头啃一遍,或者是把Redis、Skynet的源码过一遍,再看点Linux源码就都会了。虽说啃大部头、看源码是服务端从业者的必经之路,但人的时间是有限的,因此,在入门阶段,在有限的时间里学到最实用的知识很关键。
找到契合实际项目开发需要的学习资料并不容易。市面上的服务端资料,有些着重讲网络编程、多线程处理等操作系统知识,这些知识虽然很重要,但不太适合“快速入门并马上有产出”的开发节奏;有些又太过简单浅显,不能适应商业游戏的品质要求。游戏服务端的知识体系既包含系统底层知识,也包含具体游戏业务的设计,内容很多,学习不易。
基于以上所述,我决定将自己多年的开发经验全盘托出,编写一本既实用又深入浅出的游戏服务端教程,为未来游戏行业的繁荣发展添砖加瓦。
服务端成长路线
游戏公司培养新人,强调“边学边用”“有产出再深入”的技术成长路线,一般是让新人从开发简单的业务功能开始,再逐步深入底层,最后独当一面。
第一年:能做好功能
这个阶段要求能按时、按质、按量做好业务功能。刚进游戏公司参与项目开发,你需要从较简单的活动功能写起,逐渐过渡到能编写较为复杂的跨服功能和战斗功能等。
第二年:能用好框架
公司开启一个新项目,一般不会从零做起,而是会拿一套已有代码参考,根据需求做修改。这个阶段就要求你能够分析别人为什么要这样设计,并能修改底层功能,改善性能问题。
第三年:能重建系统
当旧框架已经落后于时代,或者历史遗留问题太多,又或者想开展新业务、开发不同类型的游戏时,你就要从零开始设计了。这个阶段要求你有重新搭建整套服务端系统的能力。
本书的内容选择和章节设计,正是基于这样的成长路线规划的。先用现成的Skynet引擎把游戏做出来,再逐步深入,重构整套系统。经过这几个阶段的打磨,相信不久的将来,你就能够独当一面。
读者对象
这里根据用户需求划分出一些可能使用本书的用户。
·职场新人:本书很适合刚入行的服务端工程师,书中所介绍的知识和问题,是每个游戏从业人员都会遇到或必须解决的。本书可作为提升技术水平的学习资料,也适合用作游戏公司服务端新人的培训材料,书中既涵盖了该岗位的必备知识,也包含了《球球大作战》、Sunnet(C++仿写Skynet底层)等实践项目。我们希望职场新人读完本书之后,不仅能够更快更好地完成手头工作,还能够为下一阶段的职业发展做好积累。
·开发类岗位的求职者:本书也适合游戏公司开发岗位的求职者。书中对服务端岗位所需知识、商业游戏常遇到的问题等进行了讲解,覆盖了常见的面试内容。我们希望本书能够帮助读者获得C++服务端开发工程师的岗位。
·高校学生:本书可作为高校教科书。书中内容是按照游戏公司的需求设计的,内容循序渐进,且包含诸多示例。我们希望本书可以帮助学生掌握实用的知识,帮助他们构建完整的知识体系,也为未来的进一步进修或职业发展提供助力。
·游戏开发爱好者:在本书中,“学以致用”的理念贯穿全书,对于想要自己制作一款网络游戏的业余开发者来说,本书很适合作为自学的参考书。我们希望本书可以帮助读者“先把游戏做出来”,让读者能够先快速使用现成的Skynet框架,再逐步深入底层,为梦想助力。
如何阅读本书
如果你是一位服务端新人,强烈建议你按顺序阅读本书,并复现一遍书中的示例。在本书的选材和结构编排上,我花了两年时间思考,也做过很多调研工作,相信它是相对合理的。图1展示了本书的知识线,可以看到,里面包含“业务层”“框架层”“底层”这三个层次的内容,较为全面。本书把大部分重心放在了“学以致用”部分,配合诸多图示、示例,让读者不会觉得枯燥。
要用好本书不需要高超的编程技巧,但是确实需要对其中某种语言的语法有基本的了解;又因为本书示例都运行在Linux环境下,因此也需要对Linux的操作有基本的了解。
如果你并不打算使用Skynet引擎,而是希望透过本书了解C++/Lua服务端的通用知识,那么可以直接跳过第2章,因为这一章着重介绍Skynet的使用方法;你也可以跳过第3章和第4章中的代码示例,因为它们都是基于Skynet做演示,但这两章会说明服务端拓扑结构、登录流程以及一些实用技巧,这些内容不建议跳过。
图1 本书知识线
如果你使用的是Java、Erlang、Golang等语言,也不打算了解C++底层,更希望透过本书了解一些业务层的通用知识,那么建议你重点关注第1、3、4、8、9、10章。
本书所有示例的源码和素材均可以在Github或网盘下载。我也会在Github上发表勘误和补充内容等,欢迎关注。考虑到网盘不稳定,因此我无法保证多年后网盘地址还有效。若读者发现网盘地址失效,可以给我发邮件,我将会把最新的下载地址发给你。
Github:https://github.com/luopeiyu/million_game_server
百度网盘:https://pan.baidu.com/s/1icbEXxq2HeIXfUeuqiKyvQ(提取码为wa3d)
作者邮箱:aglab@foxmail.com
勘误和支持
由于作者水平有限,编写的时间也很仓促,书中难免会出现一些错误或者表述不准确的地方,恳请读者批评指正。如果读者发现书中的错误,或者有更多宝贵意见,欢迎发送邮件至邮箱aglab@foxmail.com,我很期待听到你们的真挚反馈。
致谢
早在2017年,我便开始规划本书的目录结构,并在2018年开始试写一些章节。经过几年积累,本书终于逐渐成型。若没有身边众多亲朋好友的支持,本书的出版过程不可能一帆风顺。
感谢机械工业出版社华章分社的杨绣国编辑,在她的帮助下,2019年年末,本书的出版计划正式提上日程。
感谢四三九九公司的同事们。感谢我的直接上司徐康成就了技术研发中心的良好氛围。感谢邝剑洪、黄虹学、丘盛、黄赞在“4399未来主程俱乐部”帮本书做宣传。
几乎每个工作日的中午,我和邝松恩、张浩楠、张永明等同事都会找个地方买杯咖啡畅谈技术方案,一些灵感也是从这些交流中得来的,谢谢他们。感谢以下同事给我诸多建议:陆俊壕、王雅伦、李永航、孙杰、梁振、徐锐忠、葛剑航、梁耀堂、黄剑基、陈鸿才、樊潮波、李杰文。
在本书编写期间,我对书籍选材、章节安排做过一些调研,并询问了诸多好友,他们给了我许多建设性意见。这些好友包括:沙梓社、胡耀、陆泽西(Jesse Lu)、林煜、宫文达、卢阳飞、叶健勇、张曦、徐锦鸿、詹俊雄、李石清、方涛、胡文鼎、张贝、陈欣妮、李骏(Jarjin Lee)。
感谢我的父母,他们的努力,让我能义无反顾地前行。
每一款游戏都是梦想与智慧的结晶!
罗培羽
2021年7月于广州