C 遊戲伺服器的效能優化

2022-07-10 09:45:10 字數 1499 閱讀 4414

以下是最近某個專案的一次經歷,最終並沒有按照這樣的方案來優化,但對思路確實是乙個提高,所以記錄在此。

整體來說:c++伺服器+mysql資料庫,多執行緒。但是是單服。

請教了前同事,在他的一步步詢問下,理清了伺服器的當前架構。

同事指導,對於伺服器效能分析,要從記憶體分配和多執行緒兩個方面入手。

修改記憶體分配策略不但能降低記憶體,還能減少碎片,最終勢必會提高遊戲效能(分配阻塞導致效能低)。

使用多執行緒,將複雜的邏輯非同步到不同的執行緒去計算,減少了主邏輯的等待,也必然提高了流暢性。

執行緒方面:

1 乙個socket負責監聽所有客戶端的session。使用了完成埠的概念,起了3個執行緒,負責收訊息,收到後,將訊息放入乙個全域性的佇列revqueue中,這個佇列包含所有玩家的所有訊息。

2 全域性的session管理類,管理所有客戶端的session。每個玩家傳送訊息時,寫入自己的發訊息佇列ownsendqueue中。

3 乙個單獨的資料庫操作佇列dbqueue,負責所有對資料庫的讀取。

4 啟動遊戲時,開了乙個執行緒,專門負責內部邏輯的重新整理。包括各種timer,資料庫佇列dbqueue的分發,全域性收訊息佇列revqueue的分發(每次輪詢到時,會將佇列中的所有訊息都分發出去),每個session的發訊息佇列ownsendqueue,其它遊戲內的各種update(血量體力等各種恢復)。

記憶體分配:

1 會頻繁使用到標準庫的map,vector,string物件。

2 對自定義的類,有記憶體池的管理策略。當前策略:

這一系列的分析出來,問題相對而言就明顯了。

記憶體沒有達到有效的使用。

邏輯全在乙個執行緒,應該就是整個瓶頸所在了。

針對問題提出的優化策略:

1.記憶體分配方法

對於已有的記憶體池策略:

每次增長的數(目前32)是否可優化為更大,或者修改為梯形增長方式,或者以每次2倍的速度增長?需要資料驗證可行性。

徹底的接管記憶體分配

2.平行計算

以上是在不改變當前單服的狀態下,可做出的優化。畢竟單服總有上限,如果以上的優化都不能達到想要的效果,就要拆分伺服器了。

gate和master之間增加loginserver,或者gate本身增加loginserver的功能。

負責:登陸驗證、創角、角色列表、刪角、 封禁ip過濾等處理,其它邏輯交給master。

增加logserver,監聽master傳送的訊息,專門負責和logdb的互動。

再次重複下,以上只是某個專案的一次經歷,最終並沒有按照這樣的方案來優化,但對思路確實是乙個提高,所以記錄在此。

C 遊戲伺服器的效能優化

以下是最近某個專案的一次經歷,最終並沒有按照這樣的方案來優化,但對思路確實是乙個提高,所以記錄在此。整體來說 c 伺服器 mysql資料庫,多執行緒。但是是單服。請教了前同事,在他的一步步詢問下,理清了伺服器的當前架構。同事指導,對於伺服器效能分析,要從記憶體分配和多執行緒兩個方面入手。修改記憶體分...

C 遊戲伺服器的效能優化

以下是最近某個專案的一次經歷,最終並沒有按照這樣的方案來優化,但對思路確實是乙個提高,所以記錄在此。整體來說 c 伺服器 mysql資料庫,多執行緒。但是是單服。請教了前同事,在他的一步步詢問下,理清了伺服器的當前架構。同事指導,對於伺服器效能分析,要從記憶體分配和多執行緒兩個方面入手。修改記憶體分...

C 遊戲伺服器的效能優化

以下是最近某個專案的一次經歷,最終並沒有按照這樣的方案來優化,但對思路確實是乙個提高,所以記錄在此。整體來說 c 伺服器 mysql資料庫,多執行緒。但是是單服。請教了前同事,在他的一步步詢問下,理清了伺服器的當前架構。同事指導,對於伺服器效能分析,要從記憶體分配和多執行緒兩個方面入手。修改記憶體分...