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

游戏后台开发==游戏服务器开发mysql
6,“游戏服务器”到底指什么?
- 承载游戏服务的硬件;
- 提供游戏服务的软件;
- 开发游戏服务的程序员。
2、游戏服务的特色及应对
1,游戏服务要解决的核心问题
知足海量游戏用户的稳定和高质量的服务需求ios
- 海量 - 十万~百万~千万级同时在线,最高达亿级注册量;
- 稳定 - 相对于:宕机,网络和计算卡顿;
- 高质量 - 快速:网络延迟;逻辑严谨;更新频率和及时性。
2,游戏服务与其余互联网服务的区别?
延迟敏感程序员
- 实时交互游戏通常须要网络延迟在300ms之内才能保证体验。
实时的高强度交互算法
- 单个终端高频发送请求;
- 单次请求引起多处数据改变;
业务逻辑复杂,内部耦合度高sql
- [延迟敏感+高强度交互]同时做用下,[状态维护]每每成为必需;
- 复杂游戏服务的实现代码,可达百万行量级。
变动频度高,幅度大shell
3,先后台程序的区别

- 拥有全部资源的控制权;
- 重视资源的合理使用而不是最少占用。
- 重视性能;
- 重视可伸缩性。
性能来自于数据库
- 算法选择与算法优化:排序、查找、空间-时间。
- 操做系统/应用程序运行机制:IO多路复用;局部性原理;编程语言。
- 硬件:CPU的充分利用_多线程/多进程;存储层级的理解和利用;多队列网卡。
持续运行,意味着:稳定最重要;容错;日志和监控。编程
(1)服务稳定包含的因素设计模式
(2)如何才能作到稳定?

KISS==Keep It Simple&Stupid (一看就懂)
容错方面
(1)错误不可避免(逻辑自身bug、程序运行环境、外部影响)
(2)基本要求 - 错误范围可控
- 一个用户的错误不要传染到其余用户;
- 非核心功能的失效不要致使整个系统服务的失效。
(3)基本应对 - 错误隔离和可快速恢复。
4,游戏后台开发的方法论
(1)本质上是应对海量服务的问题。
(2)出发点:两种不一样的困难
- 事情自己逻辑很简单,可是并发规模很是大;
- 事情自己的逻辑复杂,要经历复杂的处理步骤。
(3)方法论 - 分治
大的问题分解成小问题,小问题继续分解,最终在合适的力度下获得解决。
服务分布化
内部复杂度应对:分层分块。
(4)方法论 - 灰度

什么是灰度:抛弃0/1思惟;在不一样的场景下提供不能的服务。
在不一样范畴维度的应用:服务降级;灰度分布。
感悟:任何事情都不是非黑即白的,能够灰度发布,灰度服务(取中间值)。
5,游戏服务器的相关参与者
开发者:服务器程序员。
开发伙伴:客户端程序员,游戏策划。
构建-测试:测试工程师。
部署维护:运维工程师。
3、游戏服务器开发技术介绍
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
4、参考资料
服务器_维基百科
游戏服务器与普通服务器有什么区别_知乎
5、总结
在拿到offer的那一刻,我不知道游戏服务器端是作什么的。在部门大佬的指导和介绍下,我打开了本课程开始学习。课程总共有16节,我争取学习完一节课程后就整理,总结,吸取好这节课的内容,而后发布到博客上,但愿我能坚持到底!
若是有写的很差或须要补充的地方请及时提出来,我看到后会及时更新的。^_^