服务端程序要承载很多玩家,性能是必须要考虑的问题

302 阅读4分钟

课程简介

本课程为机械工业出版社出版的图书《百万在线:大型游戏服务端开发》的电子版。

第一部分:学以致用(第1~4章),这部分介绍了Skynet引擎的使用方法及注意事项,以《球球大作战》的案例贯穿其中,全面又详尽地剖析了服务端结构设计、通信协议格式、数据表结构设计、断线重连等方案的核心技术。

第二部分:入木三分(第5~7章),这部分揭示了在多核时代采用现代C++编写多线程TCP网络服务器的高效做法,以C++重写Skynet的案例贯穿其中,使用大量图表,生动翔实地描述Linux环境下的编程技术。

第三部分:各个击破(第8~11章),这部分列举了同步算法、热更新、防外挂等实际工程难题,并对其逐一击破,非常具有实用价值。尽管本书以Skynet为例,但其同样适用于使用C++自研引擎的项目组,甚至是选用Erlang、Golang、Java的开发者。

关键词:

C/C++/Lua | Socket、TCP/IP、Protobuf | Linux开发环境 | 多线程、数据库、分布式 | 高并发、内存泄漏、热更新

服务端程序要承载很多玩家,性能是必须要考虑的问题

第1.1节 百万在线:大型游戏服务端开发 ,我们简单介绍了从玩家的角度来看,一款网络游戏大都会涉及的流程,在此过程中,藏在幕后的服务端做了很多事情,那究竟做了哪些?此服务端系统又是如何开发的呢?

第1.2小节开发游戏服务端,从网络编程着手),服务端程序要承载很多玩家,性能是必须要考虑的问题。那么,1.2.4节的程序能够承载多少玩家同时在线呢?

1.3.1 单线事件模型

图1-11展示了1.2节程序的执行过程,无论何时服务端都是按顺序执行代码的。图中在时刻①,客户端A发送消息,服务端接收并处理。在①和②之间,服务端没有消息接收,进入等待状态。在时刻③客户端A和B同时发送消息,服务端收到后,先后执行。

有个专业术语叫“Reactor模型”,指的就是图1-11所示的程序执行方式,这里做个狭义的翻译——单线事件模型。“单线”指的是单线程,“事件”指的是事件触发,即当新连接、断开连接、收到数据这些事件到来时会触发某段代码。

服务端程序要承载很多玩家,性能是必须要考虑的问题

图1-11 单线模型的时序图

1.3.2 承载量估算

要计算服务端系统的承载量,则要从CPU负载、内存占用、网络流量等多个角度考量,很难做到准确的估算,因为服务端运行在不同配置的物理机上,不同游戏类型的逻辑复杂度也不相同。但可以做个假设,假设在MMORPG中,玩家平均每3秒操作一次(走路、购物),服务端平均处理一条消息花费2毫秒。

从CPU的角度来看,同一时刻服务端只能处理一个客户端请求,按上述假设,服务端每秒可以处理500条消息,即最高可以承载1500人。

按经验推算,最高1000多人在线的游戏,日活跃用户(即每天登录的人数)大概是三五千。这种承载量对于多数独立游戏、小型手游是足够的。

知识拓展:尽管理论上CPU可以承载1000多人,但在实际情况中会低很多,而且这里只计算了CPU的负载,事实上,内存、网络流量也会对其有影响。“走路”程序受网络影响很大,因为玩家对服务端的响应速度有要求,总不能走一步等3秒钟后才有回应吧。如果不做进一步优化,广播的消息量与在线玩家则呈指数增长关系,通常这类单线程程序只能支持几十名玩家。

下一节,会继续讲解 用分布式扩能 的内容,完整版本可以前往UWA学堂查看。

适合读者

1、刚入行的服务端工程师

2、游戏公司开发岗位的求职者

3、对游戏开发感兴趣的高校学生

4、游戏开发爱好者

你将获得

1、充分了解业务逻辑和底层框架的设计意图

2、立足实践的服务端学习思路,深入浅出

3、用实际案例贯穿各知识点,在实践中学习

4、了解商业游戏的设计思路和实现方法