聲明:本文內容源自騰訊遊戲學院程序公開課。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節,我爭取學習完一節課程後就整理,總結,吸取好這節課的內容,而後發佈到博客上,但願我能堅持到底!
若是有寫的很差或須要補充的地方請及時提出來,我看到後會及時更新的。^_^