Fork me on GitHub
打赏

游戏服务器概述

声明:本文内容源自腾讯游戏学院程序公开课。

一、什么是游戏服务器

1,从游戏玩家之间的交互形态出发

  • 单机游戏:一个人在机器上玩。
  • 联网游戏:同时玩的范围比较小,比如8-10个人。
  • 网络游戏:在远端有许多机器跑一个很大的系统,可以有几千几万几十万甚至更多的玩家连进来一起玩。

2,游戏服务是互联网服务的一种

  • 常见的其他互联网服务有:搜索(百度)、电商(阿里)、即时通讯(腾讯)、邮件、视频等

3,游戏服务的基本职能有哪些?

  • 网络连接和数据收发:TCP收包打包分包。
  • 数据存取
  • 逻辑计算
  • 状态保持:上下文、内部驱动等等。

4,游戏服务器:严格说是一个硬件概念

  • 常见种类:机架式服务器,刀片机,小型机。
  • 会根据游戏类型或运行程序的不同,在CPU/内存/硬盘上有所侧重。

5,游戏服务器开发

  • 从游戏交互形态,看游戏开发分工

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

6,“游戏服务器”到底指什么?

  • 承载游戏服务的硬件
  • 提供游戏服务的软件
  • 开发游戏服务的程序员

 

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

1,游戏服务要解决的核心问题

满足海量游戏用户的稳定和高质量的服务需求

  • 海量 - 十万~百万~千万级同时在线,最高达亿级注册量;
  • 稳定 - 相对于:宕机,网络和计算卡顿;
  • 高质量 - 快速:网络延迟;逻辑严谨;更新频率和及时性。

2,游戏服务与其他互联网服务的区别?

延迟敏感

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

实时的高强度交互

  • 单个终端高频发送请求;
  • 单次请求引发多处数据改变;

业务逻辑复杂,内部耦合度高

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

变更频度高,幅度大

  • 变更幅度,包含内容和逻辑。

3,前后台程序的区别

  • 独占,意味着什么?
  1. 拥有所有资源的控制权;
  2. 重视资源的合理使用而不是最少占用。
  • 大量并发任务,意味着什么?
  1. 重视性能;
  2. 重视可伸缩性。

性能来自于

  • 算法选择与算法优化:排序、查找、空间-时间。
  • 操作系统/应用程序运行机制:IO多路复用;局部性原理;编程语言。
  • 硬件:CPU的充分利用_多线程/多进程;存储层级的理解和利用;多队列网卡。

持续运行,意味着:稳定最重要;容错;日志和监控。

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

  • 避免程序异常终止;
  • 持续高效的运算与通信。

(2)如何才能做到稳定?

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

容错方面

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

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

  • 一个用户的错误不要传染到其他用户;
  • 非核心功能的失效不要导致整个系统服务的失效。

(3)基本应对 - 错误隔离和可快速恢复。

4,游戏后台开发的方法论

(1)本质上是应对海量服务的问题。

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

  • 事情本身逻辑很简单,但是并发规模非常大;
  • 事情本身的逻辑复杂,要经历复杂的处理步骤。

(3)方法论 - 分治

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

服务分布化

  • 三层架构:接入-逻辑-存储;
  • 通用服务:微服务。

内部复杂度应对:分层分块。

(4)方法论 - 灰度

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

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

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

5,游戏服务器的相关参与者

开发者:服务器程序员。

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

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

部署维护:运维工程师。

 

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

1,算法

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

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

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

 

四、参考资料

服务器_维基百科

游戏服务器与普通服务器有什么区别_知乎

Lua 为什么在游戏编程领域被广泛运用?_知乎

 

五、总结

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

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

 

posted @ 2018-07-26 15:52  Zoctopus_Zhang  阅读(2353)  评论(1编辑  收藏  举报
// function btn_donateClick() { var DivPopup = document.getElementById('Div_popup'); var DivMasklayer = document.getElementById('div_masklayer'); DivMasklayer.style.display = 'block'; DivPopup.style.display = 'block'; var h = Div_popup.clientHeight; with (Div_popup.style) { marginTop = -h / 2 + 'px'; } } function MasklayerClick() { var masklayer = document.getElementById('div_masklayer'); var divImg = document.getElementById("Div_popup"); masklayer.style.display = "none"; divImg.style.display = "none"; } setTimeout( function () { document.getElementById('div_masklayer').onclick = MasklayerClick; document.getElementById('btn_donate').onclick = btn_donateClick; var a_gzw = document.getElementById("guanzhuwo"); a_gzw.href = "javascript:void(0);"; $("#guanzhuwo").attr("onclick","follow('33513f9f-ba13-e011-ac81-842b2b196315');"); }, 900);