遊戲伺服器概述

不會飛的章魚發表於2018-07-26

宣告:本文內容源自騰訊遊戲學院程式公開課。
注:從部落格上搬過來,格式調起來太費時間,有興趣的可以看原文,本文首發於部落格園。
原文連結: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節,我爭取學習完一節課程後就整理,總結,吸收好這節課的內容,然後釋出到部落格和簡書上,希望我能堅持到底!

如果有寫的不好或需要補充的地方請及時提出來,我看到後會及時更新的。^_^

相關文章