游戏服务器概述
聲明:本文內容源自騰訊游戲學院程序公開課。
一、什么是游戲服務器
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
?
四、參考資料
服務器_維基百科
游戲服務器與普通服務器有什么區別_知乎
Lua 為什么在游戲編程領域被廣泛運用?_知乎
?
五、總結
在拿到offer的那一刻,我不知道游戲服務器端是做什么的。在部門大佬的指導和介紹下,我打開了本課程開始學習。課程總共有16節,我爭取學習完一節課程后就整理,總結,吸收好這節課的內容,然后發布到博客上,希望我能堅持到底!
如果有寫的不好或需要補充的地方請及時提出來,我看到后會及時更新的。^_^
?
轉載于:https://www.cnblogs.com/OctoptusLian/p/9367578.html
總結
- 上一篇: CF911F Tree Destruct
- 下一篇: git的团队协作开发