经常能听说某某策划自学技术然后把单机游戏做出来,但很少听说谁自己做了个网游,除了工作量大之外,服务端的门槛是原因之一。
比起游戏客户端,游戏服务端的入门难度较高。原因在于,其一,客户端引擎和工具相对完善和统一,学习资料众多,而服务端至今没有较强大的方案,都是各个项目自己的一套,且很多缺乏文档;其二,犯错的风险较大,特别是对于线上游戏,出bug的危害要比客户端bug大一些;其三,服务端开发涉及到的技术领域较多,又不直观,加大了开发难度。
跨越层次多,导致知识盲区大
从技术角度,入门服务端的难点在于需要跨越较多的技术层次。以下是服务端程序的一种分层,这里我把它分层6层。实际项目中往往某些层的内容较少,不会单独分出来,但逻辑上的分层大体相似。这6层分别是①基础层②核心层③框架层④逻辑底层⑤逻辑中间层⑥逻辑上层,各层的内容如下:
①基础层
数学库、数据结构、缓冲区、字符串处理、Json等
②核心层
网络库、数据库、协议编码解码、定时器
③框架层
分布式结构、消息分发、热更新、数据持久化
④逻辑底层
登录、实体、离线消息、黑名单、AOI算法
⑤逻辑中间层
物品、公告、邮件、聊天、称号、成就、排行榜、签到、首充
⑥逻辑上层
战斗、副本
加上一些运维知识,这6层组成了游戏服务端技术的知识结构。对于刚毕业的同学,或者刚接触服务端开发的同学,已有的知识结构大体如下图所示。下图展示了普遍的计算机相关专业毕业生可能的服务端开发知识掌握的程度,学校课程大都注重基础,所以合格的毕业生一般基础较好,特别对数学、操作系统、数据结构、算法都有较好的掌握;学校一般会开设网络、数据库等课程,而且如果参与科创类项目,也可能会用到,所以毕业生对核心层的知识稍有接触;因为在学校会写一些程序,或者是课程作业,对简单的逻辑实现一般都有基础,所以逻辑中层也算稍有接触。但其他三个层和游戏业务关联较大,一般接触不多。
为什么不容易自学
经常能听说某某策划自学技术自己做了个好玩的单机游戏出来,但较少听说谁自学服务端做的很好的。除了就算做出来也无法直接拿给别人看的原因外,过长的学习流程是导致自学不易的主因。如下图,要做好服务端开发,可能要先学socket、学网络协议,再由此基础搭建服务端,然后实现各种功能。
但是核心层的知识,比如网络、数据库,包含的内容比较多,而且如果要做到高效率、不出错,需要学习很多内容。比如网络,先丢几本书,很厚。
比如数据库,再丢一本书,还是很厚。
这就导致了学习的流程很长。以看书学习为例,如果学客户端,可能看到第一章就能做个五子棋,看到第二章就能做个贪食蛇,以此类推,每一步都能出点成果。而如果看服务端的,那就完了,可能先啃个200页的基础,啥都做不出来,等看到300页才做个很基础的,这对自学是非常打击的。
游戏公司怎样培养人新人
如果是比较成熟的游戏公司,会有一套带新人的体系。一般而言,会从业务需求出发,先让新人接触简单的业务逻辑,再逐步涉及复杂的业务,当熟悉业务后可能会尝试一些改动框架底层的任务,以提升技术水平。这样每次学习基本只需学习一个层次的知识,减少了难度。
如下图,在一开始时接触较为简单的业务,那么只需仿照逻辑中层的已有代码,稍微熟悉支撑它的逻辑底层即可。对于复杂的核心层、框架层无需学会,减少了入门难度。
但也由于业务层不太涉及核心层和基础层,买手机靓号某些公司不太注重长期的人才培养,仅培养到“能开发业务”这层就停止。对于新人,核心层与基础就要靠自己学习。业务层的编写更多是模仿能力,仿照已有的代码改动,而核心层会涉及一些底层的知识。
对比于从基础开始的自学,公司培养模式的学习曲线如下图的橙色线,学习一点就能出一点输出。而自学曲线如蓝色线,要花上较长时间才有输出。
另一方面,某些游戏公司会给程序员评级,比如从初级程序、核心程序一直到行业专家。
其中一种等级划分方法是根据能够解决问题的范围而定。如下图,具体来说能够解决部分业务问题的是初级程序员,能够解决所有业务问题的是核心程序员,能够解决所有技术问题的是副主程,能够在解决所有技术问题并能够管理团队的是主程,能解决任何问题的是行业专家。
尽管要2年后才动笔,作为后续服务端书籍的调研,一套好的教程应当有好的流程,从游戏公司的培养模式上汲取经验,能够让读者看一点就能输出一点成果,尽量避免看到最后才能做点东西。另,笔者的《Unity3D网络游戏实战(第二版)》详解了一套简易服务端的实现,欢迎关注。