声明:本文内容源自腾讯游戏学院程序公开课。
注:从博客上搬过来,格式调起来太费时间,有兴趣的可以看原文,本文首发于博客园。
原文链接:https://www.cnblogs.com/OctoptusLian/p/9367578.html

一、什么是游戏服务器

1,从游戏玩家之间的交互形态出发
单机游戏:一个人在机器上玩。
联网游戏:同时玩的范围比较小,比如8-10个人。
网络游戏:在远端有许多机器跑一个很大的系统,可以有几千几万几十万甚至更多的玩家连进来一起玩。
2,游戏服务是互联网服务的一种
常见的其他互联网服务有:搜索(百度)、电商(阿里)、即时通讯(腾讯)、邮件、视频等
3,游戏服务的基本职能有哪些?
网络连接和数据收发:TCP收包打包分包。 数据存取
逻辑计算
状态保持:上下文、内部驱动等等。
4,游戏服务器:严格说是一个硬件概念
常见种类:机架式服务器,刀片机,小型机。
会根据游戏类型或运行程序的不同,在CPU/内存/硬盘上有所侧重。
5,游戏服务器开发
从游戏交互形态,看游戏开发分工
enter image description here

游戏后台开发==游戏服务器开发

6,“游戏服务器”到底指什么?
承载游戏服务的硬件;
提供游戏服务的软件;
开发游戏服务的程序员。

二、游戏服务的特点及应对

1,游戏服务要解决的核心问题
满足海量游戏用户的稳定和高质量的服务需求

海量 - 十万~百万~千万级同时在线,最高达亿级注册量;
稳定 - 相对于:宕机,网络和计算卡顿;
高质量 - 快速:网络延迟;逻辑严谨;更新频率和及时性。
2,游戏服务与其他互联网服务的区别?
延迟敏感

实时交互游戏一般需要网络延迟在300ms以内才能保证体验。 实时的高强度交互

单个终端高频发送请求;
单次请求引发多处数据改变;
业务逻辑复杂,内部耦合度高

[延迟敏感+高强度交互]同时作用下,[状态维护]往往成为必需;
复杂游戏服务的实现代码,可达百万行量级。
变更频度高,幅度大

变更幅度,包含内容和逻辑。
3,前后台程序的区别
enter image description here
独占,意味着什么?
拥有所有资源的控制权;
重视资源的合理使用而不是最少占用。
大量并发任务,意味着什么?
重视性能;
重视可伸缩性。
性能来自于
算法选择与算法优化:排序、查找、空间-时间。
操作系统/应用程序运行机制:IO多路复用;局部性原理;编程语言。
硬件:CPU的充分利用_多线程/多进程;存储层级的理解和利用;多队列网卡。
持续运行,意味着:稳定最重要;容错;日志和监控。

(1)服务稳定包含的因素

避免程序异常终止; 持续高效的运算与通信。 (2)如何才能做到稳定?
enter image description here

KISS==Keep It Simple&Stupid (一看就懂)

容错方面

(1)错误不可避免(逻辑自身bug、程序运行环境、外部影响)

(2)基本要求 - 错误范围可控

一个用户的错误不要传染到其他用户;
非核心功能的失效不要导致整个系统服务的失效。
(3)基本应对 - 错误隔离和可快速恢复。

4,游戏后台开发的方法论
(1)本质上是应对海量服务的问题。

(2)出发点:两种不同的困难

事情本身逻辑很简单,但是并发规模非常大;
事情本身的逻辑复杂,要经历复杂的处理步骤。
(3)方法论 - 分治

大的问题分解成小问题,小问题继续分解,最终在合适的力度下得到解决。

服务分布化

三层架构:接入-逻辑-存储;
通用服务:微服务。
内部复杂度应对:分层分块。

(4)方法论 - 灰度

什么是灰度:抛弃0/1思维;在不同的场景下提供不能的服务。

在不同范畴维度的应用:服务降级;灰度分布。

感悟:任何事情都不是非黑即白的,可以灰度发布,灰度服务(取中间值)。

5,游戏服务器的相关参与者
开发者:服务器程序员。

开发伙伴:客户端程序员,游戏策划。

构建-测试:测试工程师。

部署维护:运维工程师。

三、游戏服务器开发技术介绍

1,算法
(1)了解常见查找/排序算法的特点:利用算法来改善性能,胜于通过编译器选项、编程技巧;

(2)根据业务情况合理的选择算法

尽量选用复杂度<=O(NlogN)的算法;算法时间复杂度查询
常见话题:C++ STL的使用。
2,系统层面
(1)对操作系统基础知识的了解

处理器管理
进程管理
线程调度
内存管理
IO管理
权限管理 ...etc
(2)对Linux操作系统的了解

内核
用户管理
文件系统
进程、线程
进程间通信
网络
信号处理
权限等
3,开发工具
对编译器gcc的了解
对调试器gdb的了解
对文档工具ar的了解
对autotools的了解
对Makefile的了解
对性能分析工具的了解
对内存泄露调试工具的了解
对samba文件共享的了解
对版本管理工具(cvs/svn/cc)的了解
4,语言
(1)选择编程语言的几个因素

业务复杂度
执行效率VS开发效率
开发人员和团队能力
(2)C/C++技能要求

对C/C++的语法非常了解
对Ansi C库函数非常了解
对指针有正确而且牢固的认识
对STL库非常了解
对C/C++语言的内存分配机制非常了解
对第三方框架的了解(如ACE/ICE等)
5,脚本语言
(1)Shell脚本

Linux下的程序开发,学会使用shell脚本会大大的提高工作效率;
一些工作适合用shell来完成,开发效率更快;
shell脚本常常被用来做一些集成的工作。
(2)程序内嵌脚本语言

了解脚本(解释性语言)的优缺点;
脚本在游戏开发中的适用范围;
Lua/Python/自定义脚本。
6,软件设计技巧
(1)化繁为简的重要途径:区分“变化性”是其中的关键。

(2)设计原则 - SOLID

单一责任原则
开发-封闭原则
里氏替换原则
依赖倒置原则
接口分离原则
(3)设计模式:可以视为设计原则的应用。

想清楚:用到这些方法、方式,它的原因是什么?

7,Linux下的常用工具
系统管理工具:ipcs/ps/top/...
文件系统工具:ls/find/where/which/locate...
文件处理工具:sed/grep/...
性能检测工具:iostat/memstat...
SSH工具:ssh/ssh2/sshd/ssh2d/scp/...
8,专项技术
(1)关系数据库

对数据库原理的了解
常见DBMS:mysql:了解mysql的安装和简单管理;性能调优的房;赋值;备份和恢复。
对SQL语言的了解及使用
对数据库表结构设计的了解
(2)NoSQL

KV型的数据存储方式
CAP & BASE
Redis/MongoDB
(3)文件

(4)网络接入,协议

了解TCP/UDP协议
了解HTTP协议
底层网络编程接口:BSD SOCKET
网络多路处理机制:signal/select/poll/epoll/...
C10K ~ C1000K
Google Protobuf

总结

在拿到offer的那一刻,我不知道游戏服务器端是做什么的。在部门大佬的指导和介绍下,我打开了本课程开始学习。课程总共有16节,我争取学习完一节课程后就整理,总结,吸收好这节课的内容,然后发布到博客和简书上,希望我能坚持到底!

如果有写的不好或需要补充的地方请及时提出来,我看到后会及时更新的。^_^