1. 程式人生 > >遊戲伺服器之伺服器優化思路

遊戲伺服器之伺服器優化思路

本文只是提供一些遊戲伺服器優化思路,其中一些思路是用在不同場合的,不是同個架構的。需要根據應用場景選用合適方式。本文的引用的文章都是在自己寫的在本部落格內的,也都是上線開幾百個服的成熟專案的。

一、框架設計優化

1、分靜態伺服器和動態伺服器。

2、動態伺服器使用兩層負載均衡:多閘道器  和 多場景。閘道器的選擇是登陸伺服器根據閘道器的負載來選擇。場景則作為分線和副本等分開。

3、中心伺服器負責伺服器依賴檢查和內部訊息轉發和控制登入流程。中心伺服器會主動連線登陸伺服器和後臺伺服器。其他伺服器會主動連線中心伺服器。中心伺服器有主動連線和被動連線的管理器,可根據需求的伺服器型別來查詢需要的連線。

二、業務設計優化

1、網路

多執行緒使用

方式一:網路被動連線執行緒池

(1)動態執行緒排程

網路接收執行緒池的動態執行緒排程策略。接收發送網路使用多執行緒,每多增加512連線動態增加一條執行緒。

(2)網路收發處理優化

有讀才可能有寫(優先讀)。使用單獨的epoll描述符來處理讀(讀epoll描述符不處理寫,另一個epoll描述符處理讀和寫)。每隔一段時間才寫。寫是檢查寫緩衝區。

(3)網路訊息佇列

方式二:邏輯閘道器

(1)對於樹狀多閘道器物件的單邏輯伺服器。讀寫執行緒使用不同執行緒。連包使用單獨執行緒。監聽連線使用單獨執行緒。

連線處理

超過10min沒有邏輯訊息的客戶端連線可以關閉和回收。

2、資料服務

(1)讀檔

(1-1)永續性檔案

自定義檔案資料庫:提供複雜度O(1)的查詢和插入效率,插入和更新資料會增加和修改記憶體資料索引,和需要修改和新增索引檔案和資料檔案的資料記錄。

mysql

mysql控制代碼連線池,實現多執行緒控制代碼管理,啟動時獲取連線上的所有的表結構作為orm功能的欄位檢查標準。

使用儲存過程,提高常用查詢(或插入sql)效率。

(1-2)快取

自定義快取

快取賬號資訊到登入伺服器(或者資料伺服器)。

有些常用查詢可用惰性快取兼查資料庫兩個方式結合(優先查記憶體)。

第三方網路資料儲存引擎

(2)寫檔

(2-1)定時寫檔

隨機幾分鐘定時器(十分鐘或者更長)

(2-2)分優先順序寫檔

3、邏輯

(1)ai 

(1-1)場景ai優化

有效屏計算:只計算有效屏上的ai,分批(如10批)計算。

(1-2)ai型別優化

追擊型別

優化ai尋路:使用移動定時器。限制尋路長度(20格),限制a*計算次數(150內),使用開啟和關閉列表,使用小根堆記錄最小f值。

攻擊型別

使用攻擊定時器。優化ai玩家搜尋,優先仇恨列表。

迴歸型別

迴歸時直接重新整理位置。

(1-3)計算時間優化

超過20ms的ai型別處理被打斷。

(2)技能

範圍搜尋

幾何範圍搜尋:按場景具體型別屏索引來搜尋(分成三類場景屏索引:物品、npc、玩家)

羈絆範圍搜尋:視野內隊友搜尋

(3)揹包

(3-1)多格子的物品使用按圖的方式記錄物品在揹包的位置(按位記錄位置)

(4)場景資料同步

場景伺服器屏索引分為:物品、npc、玩家。

(4-1)九屏同步

1)為了減少伺服器內部資料同步(閘道器與場景伺服器之間的):閘道器和場景都有玩家的屏索引,更改時需要同步。可以減少場景伺服器和閘道器伺服器之間資料同步。

2)限制廣播範圍:技能、場景道具、npc、玩家形態上的變化只需要同步給九屏中的玩家。

(5)角色移動

如果不是很嚴格檢查,後端可以不計算阻擋(包括動態和靜態阻擋)。

(6)校驗

客戶端連線的校驗和資料包的校驗在閘道器處理。

三、c++技術優化

1、物件記憶體優化

定長的記憶體物件可使用記憶體池

(1)自定義小物件分配器

根據需求實用單物件分配器或多物件分配器,記憶體是在物件分配器的解構函式內釋放。

(2)stl記憶體池

sgi標準的stl

stl拓展記憶體池(支援單執行緒)  __gnu_cxx::__pool_alloc 

stl拓展記憶體池記憶體池(支援多執行緒的) __gnu_cxx::__mt_alloc

2、語法使用優化

3、自定義容器優化

對常用容器進行封裝使用。

4、演算法計算