遊戲伺服器架構的思考

2021-12-29 22:05:04 字數 1688 閱讀 5276

時間總是在不經意的時候就流走了,突然回想我已經做了四年遊戲開發,經歷了幾個遊戲專案,以前專案中的遊戲伺服器框架都不是我心中理想的框架,雖然不知道是不是我見識還不夠。下面記錄下我對遊戲伺服器架構的簡單思考。好的遊戲框架可以提高開發效率,節省人力成本。首先最簡單的伺服器框架,那就是只要乙個閘道器和乙個遊戲伺服器。如圖:

圖中agentserver負責客戶端連線,客戶端收發資料,將客戶端資料**給伺服器,將伺服器資料**給客戶端,幾乎沒有邏輯,這樣可以應對大併發io。所以agent可以採用乙個epoll執行緒,負責客戶端連線和資料傳送。乙個日誌執行緒,負責記錄執行過程中的日誌。主線程負責將資料傳送給gameserver和將gameserver資料傳送到客戶端傳送佇列中。gameserver就是主要的遊戲伺服器了,主要就是負責遊戲邏輯功能。gameserver的執行緒有:socket執行緒負責接收訊息,日誌執行緒負責寫入日誌,db執行緒負責資料載入和存檔。bill賬單執行緒負責將遊戲執行中的一些資料寫入資料庫作為運營日誌。主線程負責邏輯,也就是邏輯單執行緒架構模式。db執行緒中可以加入redis等nosql的應用,作為快取。這個架構比較簡單,邏輯也比較清晰,不需要進行資料同步和鎖相關的操作,但是這個架構無法實現跨服功能。

下面加入跨服功能的遊戲伺服器架構,如下圖:

圖中我們新加了兩個伺服器程序分別是router路由伺服器和世界伺服器也就是跨服伺服器。gameserver和agentserver伺服器功能不變。router負責路由訊息,world伺服器負責處理跨服功能。router可以直接乙個執行緒負責連線和資料收發。world伺服器則直接和gameserver執行緒架構一樣。這樣的架構可以輕鬆實現跨服功能,邏輯都是當初所以簡單易於開發。

現在伺服器都是多核cpu,從上面伺服器,上面的伺服器架構除了邏輯執行緒消耗cpu外其實其他執行緒都是消耗io,對cpu的消耗很少。也就是我們的伺服器都沒法充分的發揮出cpu的平行計算的能,那唯一的辦法就是邏輯多執行緒處理。邏輯多執行緒在發揮cpu平行計算能力的同時也會增加開發成本,和伺服器開發的負責度。為了避免鎖的使用可以在增加乙個程序。

下圖是乙個邏輯多執行緒的架構:

為了實現邏輯多執行緒,我們需要加入乙個本地世界伺服器,這個伺服器程序可以負責比如工會好友之類的功能,當加入了本地世界服之後其實我們可以輕鬆的實現邏輯多執行緒和多程序的功能,也就是我們的伺服器可以按照功能或者地圖將邏輯分配到不同的程序和執行緒中。

上面說了三種伺服器的架構,我個人覺得第二種更好,加入router之後我們可以增加閘道器伺服器加大並非量,但是需要gamerserver能夠處理的過來。如果遊戲確實特別火最後一種架構可以應對。閘道器可以動態增加,gameserver也可以動態增加。

伺服器開發中賬單和協議都可配置xml後用工具直接生成,如果需要協議相容那可以使用谷歌協議工具。記憶體可以直接用new分配並加入tcmalloc或者jemalloc,資料庫選擇mysql,快取選擇redis。配置最好是xml或者資料庫配置。csv配置容易出問題,不方便查詢,如果要做國外版本csv容易翻譯出錯,指令碼一般選擇lua,用lua_tinker作為中間庫。

現在的服務幾乎都是linux中執行了,所以沒必要做跨平台功能。

遊戲伺服器架構

登陸伺服器判斷賬戶合法性,如果合法的話,把session資訊寫入memcache,閘道器伺服器收到玩家連線請求後,在memcache裡查詢是否合法玩家,防止非法連線。閘道器伺服器要管理玩家連線,需要高併發,可以開多個 scene mgr純粹的 訊息功能 資料庫伺服器純粹的查詢修改資料功能,如果成為瓶...

遊戲伺服器架構

只是負責驗證使用者名稱和密碼,驗證之後返回token,token是有有效時間的,在有效時間內,並沒有保持連線的必要,所以,這裡的requestresponse可以做成短連線 http請求響應模式 提公升併發。如果超過了有效時間還沒有進入遊戲,令牌失效,在登入驗證時將被踢回重新獲取令牌。登入伺服器和閘...

遊戲伺服器架構簡介

遊戲的架構設計非常重要,好的架構 清晰,責任明確,擴充套件性強,易於除錯。這些會為我們的開發省下不少時間,對於遊戲伺服器的架構設計,我們首先要了解遊戲的伺服器架構都有什麼組成?一款遊戲到上線,需要具備哪些功能?遊戲架構本身代表是乙個體系,它包括 1.系統初始化 系統初始化是在沒有客戶端鏈結的時候,伺...