行業資訊

  • 首頁
  • 新聞中心
  • 行業資訊

關于游戲服務器開發經驗分享,157.119.28.1宇眾貴州BGP服務器游戲服務器的第一選擇!!!


2018年07月26日

游戲簡介

 

客戶端和服務器使用長連接. 游戲沒有分區的概念, 對玩家來說, 游戲只有一個區, 所有玩家相互都可以進行互動. 玩家間的互動并不十分頻繁, 不存在mmorpg里需要廣播同屏玩家信息的情況. 客戶端向服務器請求數據, 服務器一般不會主動向客戶端發送數據.

 

系統架構

 

服務器是一個分布式系統, 整個系統由若干個獨立的服務器組成. 每個服務器是一個進程, 每個進程都可以根據需要部署在相同或不同的物理機上. 進程間用 socket 通訊. 所有的進程都在一個局域網中. 整個系統有以下幾種服務器組成(每種服務器都有若干臺), 1. 網關服務器, 2. 邏輯服務器. 3. 連接服務器, 4. 功能服務器, 5. 數據庫服務器. 下面逐一介紹.

 

1. 網關服務器

網關服務器, 客戶端和網關服務器連接, 對每一個連接的玩家, 網關服務器分別向游戲服務器建立一條獨立的連接. 網關服務器沒有任何邏輯處理, 它只負責建立連接和轉發消息. 網關服務器在搭建完成后, 基本不需要在做任何變化. 網關服務器有這幾個作用:

* 為游戲服務器組提供一個統一并且安全的接口, 供客戶端使用. 

* 根據游戲負載, 游戲服務器的數量會增加或減少, 網關服務器向客戶端隔離了這個變化.

★如有服務器租用可咨詢宇眾臨風,QQ:2850293179   Tel:15999932452    服務器租用價格列表

2. 邏輯服務器

顧名思義, 邏輯服務器處理所有的玩家邏輯. 玩家通過一個簡單的 hash 算法, uid % logicServerNum, 分配到某一臺邏輯服務器上. 這臺服務器加載玩家數據, 操作它們, 然后寫入數據庫. 邏輯服務器是多線程的, 包括網絡線程, 數據庫讀寫線程, 邏輯線程等等. 邏輯線程負責處理玩家發送的所有消息. 為了降低復雜度, 邏輯線程只有一個. 

 

3. 連接服務器

假設玩家A和玩家B被分配到不同的邏輯服務器上, A要和B有互動, 就需要用到連接服務器. A把消息發送到連接服務器, 連接服務器把消息發送到B所在的邏輯服務器. B邏輯服務器處理完畢, 將消息返回給連接服務器, 連接服務器在把消息發給A邏輯服務器.

 

4. 功能服務器

功能服務器處理一些特殊功能, 這些功能通常需要用到全局數據. 比如排行榜功能和公會功能.

 

5. 數據庫服務器

一個數據庫服務器實際上就是一個 ttserver 進程. ttserver是一個key-value數據庫. 可以根據啟動參數把數據保存在內存, 或是硬盤. 數據庫服務器根據使用方式的不同, 分成這幾種:

* 內存數據庫, 只把數據保存在內存, 數據條目是有限的, 條目到達上限后, 老的數據會被刪除.

* 物理數據庫, 直接讀寫硬盤.

邏輯服務器讀數據時, 先從內存數據庫讀, 如果沒有, 再從物理數據庫讀.

寫數據時, 先寫入內存數據庫, 再寫入物理數據庫.

內存數據庫的作用就是減少讀寫數據庫的時間.

 

網絡

 

除了數據庫服務器外, 其它的服務器的網絡層都是一樣的. 使用 epoll 做多路復用. 為每個socket fd 維護一個讀緩存和一個寫緩存. 

邏輯線程向玩家發送數據時, 把數據放到寫緩存.

讀緩存里的數據夠一條完整的消息后, 取出這條消息, 放入消息隊列. 

 

消息處理

 

用一個消息隊列來作為網絡線程和邏輯線程的溝通. 往這個隊列里pop和push消息時, 需要加鎖.

邏輯線程在一個循環里中消息隊列里pop出消息, 處理它.

 

---------------------------------------------------------------------------------------

以上簡單介紹了服務器的架構. 下面說說最近對寫代碼的一些體會.

 

避免動態內存

 

雖然我們使用 tcmalloc 來做內存分配, 還是應該盡可能的避免動態申請內存. 一方面可以提高代碼的運行速度, 更重要的是可以減少bug的產生.

一個比較好的方法是為某些對象建立內存池. 

 

慎重修改別人的代碼

 

程序員寫下的每行代碼都有他的理由, 如果沒有充分理解別人的意圖, 絕不要修改別人的代碼. 

 

重構, 再重構

 

開發常常是迭代進行的: 先寫出大概的框架, 再一遍一遍的逐步完善. 在迭代的過程中, 如果原來的設計有問題, 不能用 "打補丁" 的方式讓程序正常工作, 應該重新設計. 只有這樣, 才能避免系統出現 "壞味道". 最終完成一個簡潔一致的設計.

 

一次又一次的檢查自己的代碼

 

測試能夠發現的問題是有限的. 要想在功能上線之后能夠正確的運行, 做代碼審核是必須的, 如果可能的話, 同事之間互相來做審核. 如果只能自己審核自己的代碼的話, 有一個提高效率的小技巧:  自己寫的代碼思路記得越清楚, 越難看出問題. 代碼寫好后, 過幾天再審核, 思路淡了, 往往更能發現問題.

不要只審核一次就完事了. 如果有時間, 看第二次, 第三次.

 

慎用技巧

 

技巧是有副作用的, 最大的副作用就是增加的程序的復雜度, 復雜度越高的設計一定越容易出現問題, 同時以后維護起來也更難.

在效率要求不是那么高的時候, 簡單粗暴的設計往往更好.

先寫出一個簡單的設計, 再根據要求進行優化. 簡單的設計更容易實現的正確. 把一個正確的系統修改得更快, 比把一個有問題的系統修改正確要容易得多.

 

消滅重復的代碼

★如有服務器租用可咨詢宇眾臨風,QQ:2850293179   Tel:15999932452    服務器租用價格列表

重復的代碼應該用函數封裝起來. 相似但是有細微不同的邏輯, 是有問題的, 要想辦法重構.

在同一個工程里 復制 粘貼 代碼, 是在作踐自己的職業.

 

系統運維

 

運維事故是大大的不應該, 它們完全是可以避免的. 因為它們絕大多數是由于粗心導致的.

好的運維流程應該是按部就班的進行. 使用提前設計好的腳本.

運維腳本可以用 shell 和 expect 來編寫. 應該提前考慮好需要的腳本, 早早的準備好.

 

編寫功能之外的輔助代碼

 

完成一個功能后, 要考慮如何在功能上線后, 監控它是否正常運行, 如果出現bug, 如何關閉功能, 如何修復錯誤的數據, 如何重新上線... 為這些情況編寫功能之外的輔助代碼.

 

化繁為簡, 分而治之

 

編程其實就是把現實問題抽象成邏輯模型, 再用計算機語言來實現這個模型. 這個模型應該是簡單而直觀的, 它的邊界條件和隱藏規則越少越好. 它可能又若干個模塊組成,  模塊之間必須是低耦合的. 每個模塊只完成一個簡單的任務, 這個任務應該能用一兩句話描述出來.


客服
主站蜘蛛池模板: 国产色综合一二三四| 久久久久综合网久久| 久久狠狠一本精品综合网| 99久久伊人精品综合观看| 国产成人综合色在线观看网站| 婷婷综合另类小说色区| 99久久亚洲综合精品网站| 久久综合亚洲色一区二区三区| 狠狠狠色丁香婷婷综合久久五月| 亚洲欧美日韩综合在线观看不卡顿| 色婷婷综合久久久中文字幕| 丁香婷婷色五月激情综合深爱| 欧美成电影综合网站色www| 国产精品综合久久第一页| 狠狠色噜噜色狠狠狠综合久久| 狠狠色丁香久久综合婷婷| 天天做天天爱天天综合网| 伊人青青综合网站| 国产成+人+综合+亚洲欧美| 亚洲另类激情综合偷自拍| 狠狠色婷婷久久综合频道日韩| 亚洲国产欧美国产综合久久| 一本一道久久a久久精品综合| 色欲综合一区二区三区| av色综合久久天堂av色综合在| 一本大道加勒比久久综合| 欧美一区二区三区综合| 日本丶国产丶欧美色综合| 亚洲高清无码综合性爱视频| 色综合婷婷在线| 精品国产综合区久久久久久| 天天做天天爱天天爽综合网| 亚洲日韩在线中文字幕综合| 欧美亚洲日本国产综合网| 亚洲国产综合精品中文第一区| 久久久久久综合一区中文字幕| 九九久久99综合一区二区| 国产欧美日韩综合自拍| 久久婷婷五月综合97色直播| 亚洲欧美日韩综合一区二区| 国产精品 综合 第五页|