声明:本文内容源自腾讯游戏学院程序公开课。
一、什么是游戏服务器
1,从游戏玩家之间的交互形态出发
- 单机游戏:一个人在机器上玩。
- 联网游戏:同时玩的范围比较小,比如8-10个人。
- 网络游戏:在远端有许多机器跑一个很大的系统,可以有几千几万几十万甚至更多的玩家连进来一起玩。
2,游戏服务是互联网服务的一种
- 常见的其他互联网服务有:搜索(百度)、电商(阿里)、即时通讯(腾讯)、邮件、视频等
3,游戏服务的基本职能有哪些?
- 网络连接和数据收发:TCP收包打包分包。
- 数据存取
- 逻辑计算
- 状态保持:上下文、内部驱动等等。
4,游戏服务器:严格说是一个硬件概念
- 常见种类:机架式服务器,刀片机,小型机。
- 会根据游戏类型或运行程序的不同,在CPU/内存/硬盘上有所侧重。
5,游戏服务器开发
- 从游戏交互形态,看游戏开发分工
游戏后台开发==游戏服务器开发
6,“游戏服务器”到底指什么?
- 承载游戏服务的硬件;
- 提供游戏服务的软件;
- 开发游戏服务的程序员。
二、游戏服务的特点及应对
1,游戏服务要解决的核心问题
满足海量游戏用户的稳定和高质量的服务需求
- 海量 - 十万~百万~千万级同时在线,最高达亿级注册量;
- 稳定 - 相对于:宕机,网络和计算卡顿;
- 高质量 - 快速:网络延迟;逻辑严谨;更新频率和及时性。
2,游戏服务与其他互联网服务的区别?
延迟敏感
- 实时交互游戏一般需要网络延迟在300ms以内才能保证体验。
实时的高强度交互
- 单个终端高频发送请求;
- 单次请求引发多处数据改变;
业务逻辑复杂,内部耦合度高
- [延迟敏感+高强度交互]同时作用下,[状态维护]往往成为必需;
- 复杂游戏服务的实现代码,可达百万行量级。
变更频度高,幅度大
- 变更幅度,包含内容和逻辑。
3,前后台程序的区别
- 独占,意味着什么?
- 拥有所有资源的控制权;
- 重视资源的合理使用而不是最少占用。
- 大量并发任务,意味着什么?
- 重视性能;
- 重视可伸缩性。
性能来自于
- 算法选择与算法优化:排序、查找、空间-时间。
- 操作系统/应用程序运行机制:IO多路复用;局部性原理;编程语言。
- 硬件:CPU的充分利用_多线程/多进程;存储层级的理解和利用;多队列网卡。
持续运行,意味着:稳定最重要;容错;日志和监控。
(1)服务稳定包含的因素
- 避免程序异常终止;
- 持续高效的运算与通信。
(2)如何才能做到稳定?
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节,我争取学习完一节课程后就整理,总结,吸收好这节课的内容,然后发布到博客上,希望我能坚持到底!
如果有写的不好或需要补充的地方请及时提出来,我看到后会及时更新的。^_^
- 还没有人评论,欢迎说说您的想法!