遊戲伺服器概述
宣告:本文內容源自騰訊遊戲學院程式公開課。
注:從部落格上搬過來,格式調起來太費時間,有興趣的可以看原文,本文首發於部落格園。
原文連結:https://www.cnblogs.com/OctoptusLian/p/9367578.html
一、什麼是遊戲伺服器
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節,我爭取學習完一節課程後就整理,總結,吸收好這節課的內容,然後釋出到部落格和簡書上,希望我能堅持到底!
如果有寫的不好或需要補充的地方請及時提出來,我看到後會及時更新的。^_^
相關文章
- 經典遊戲伺服器端架構概述遊戲伺服器架構
- XML伺服器概述XML伺服器
- 伺服器技術概述伺服器
- XSLT – 伺服器端概述伺服器
- 動作遊戲系統設計概述遊戲
- 遊戲開發入門(一)遊戲開發概述遊戲開發
- 郵件伺服器的基礎知識概述伺服器
- 遊戲伺服器 遠端登入遊戲伺服器工具遊戲伺服器
- 概述Nginx伺服器的作用,新手入門必知Nginx伺服器
- 仿微信打飛機小遊戲GamePlane(1)----概述遊戲GAM
- 遊戲伺服器分析遊戲伺服器
- 什麼是雲遊戲伺服器?如何選擇雲遊戲伺服器?遊戲伺服器
- 遊戲伺服器維護遊戲伺服器
- go遊戲伺服器框架Go遊戲伺服器框架
- 六種主要伺服器管理協議簡單概述-行雲管家伺服器協議
- 概述
- 遊戲伺服器架構概要遊戲伺服器架構
- 如何選擇遊戲伺服器?遊戲伺服器
- 如何搭建遊戲伺服器呢?遊戲伺服器
- [成都]風際遊戲招GO遊戲伺服器開發遊戲Go伺服器
- 遊戲伺服器主要框架特點遊戲伺服器框架
- 遊戲伺服器的常用架構遊戲伺服器架構
- 遊戲伺服器相關技術遊戲伺服器
- JVM 概述JVM
- Java 概述Java
- mongodb 概述MongoDB
- Java概述Java
- TCP 概述TCP
- CloudHub概述Cloud
- ElasticSearch 概述Elasticsearch
- SparkSQL 概述SparkSQL
- Kafka 概述Kafka
- JDBC概述JDBC
- Promise 概述Promise
- GraphHttpClient概述HTTPclient
- FastDFS概述AST
- html概述HTML
- SurfaceView概述View