2012-10-01 73 views
1

我們都知道MMO遊戲的流行趨勢。球員彼此面對面生活。提高MMO遊戲性能

我關注的領域是存儲玩家動作和遊戲結果。

通過適配器Npgsql的

遊戲客戶端是基於瀏覽器的ASP.NET和所有的數據庫相關處理

理解我的查詢調用Csharp的功能,請考慮使用Csharp的和PostgreSQL V9.0以下場景

我們將遊戲進度存儲在postgres表中。

對於實例比賽有四名球員並按照活動開始

  1. 每個球員100hitpoints開始
  2. 播放機1罷工(我們指的是一個圖表,以打擊轉化爲生命值隨機-range%)
  3. 播放機2具有92HP,並返回一個光吹,所以PLAYER1具有98hp

以上兩個回合,現在將在遊戲進度表,作爲

ROW Player1HP Player2HP Strikefrom StrikeTo ReturnStrikeHP Round TimeStamp StrikeMethod 
1  100  100   0  0   0   0 
2  98  92  P1  P2   2   1 

找到,如果比賽已經結束,我們檢查3名球員都爲零生命值或者gametime已經從去年的進步經過一個規定的超時值

我們桌上有一個主關鍵字,以遊戲者身份爲基礎隨機出現32個字符的代碼(每個玩家8個)

還有其他專欄,如護甲,法力,法術, 48欄 - 每個玩家12個及其屬性

最後,存在具有比賽的結果,tournamentid,tournament_timestamp,gameresult(完整,PlayerSurrender,InvalidSession,SecurityHack,超時),winnerPlayer,playerMetrics,rowIDfrom一個gameResult表,rowIDto

QUERY

我的問題是關於遊戲數據庫或SQL 降低負荷集中查詢

a)如何檢測,如果玩家沒有登錄simutaneously並開了兩個遊戲會話,但不必是指一個數據庫或使用SQL

二)如何控制的記錄激增到GameProgress表。讓玩家更快得到迴應。在服務器啓動滯後在高峯時段或1000名玩家在線

There is a tremendous flow of sql queries, for ex. even in the current game version 
There are average/minimum 100 tournaments online per 12 minutes or 500 players/hour 
In Game Progress table, We are storing each player move 
    a 12 round tourament of 4 player there can be 48 records 
    plus around same number for spells or special items 
    a total of 96 per tourament or 48000 record inserts per hour (500 players/hour) 

我正在使用C#一個後臺進程,即不斷從GameProgresstable移動過期的比賽記錄到另一個數據庫,我們有一個服務器免費還在考慮的遊戲負載。

c)我們應該多久運行一次真空充滿postgres。

我接受新的應用程序opensource或toPay,可以提高性能。例如。我們使用FastCsvReader http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader來改善服務器日誌文件的枚舉。

問候 阿文德

回答

2
How to detect if a player has not logged in simutaneously and opened two game sessions 
but without having to refer to a Database or using Sql 

假設你使用多臺服務器你的地方創建一個過程,只有註冊登錄和註銷。當它們中的一個發生時,你就會調用它。您可以使用該過程來檢查用戶是否已經登錄。例如,可以通過在所有服務器上運行該進程來調整此過程,並使用算法將serverx僅用於一部分用戶。假設您有10臺服務器,請(userId%10)獲取用戶註冊登錄/註銷的服務器的Id。

這樣你只能在服務器之間調用內存時進行這些檢查。可能你需要一個超時/刷新調用,以便斷開連接的用戶或者崩潰的服務器不會讓用戶永遠登錄。

How to control the surge of records into the GameProgress table. so that players get 
response quicker. The Server starts to lag at peak hours or when 1000 players are 
online 

#1開關的postgress數據庫的在數據庫中使用SSD的存儲

#2提升整個過程到內存中,不使用數據庫的實時工作

#3更新記錄而不是創建新的

#4使用多個數據庫和對他們分發用戶

#5 ....

Our table has a primarykey as tournamentid a random 32 character code on basis of 
playerids. 

隨機生成的主鍵是非常糟糕的做法imho。使用一個序列,或者任何東西都保證是唯一的。如果你的隨機碼不夠隨意,你會得到非常討厭的錯誤。你需要每場比賽只產生一次,所以它不是性能瓶頸。

+0

對不起!我忘記在主鍵中提及時間戳,它實際上是tournamentid + gamestarttime的組合。我們不會生成它,相反,我們只需結合所有玩家ID和時間戳,就無法獲得更獨特的功能。 SSD對於這種流量來說是否可靠? Postgres是獨立於驅動器的DB軟件。 – arvind

+1

隨機主鍵列的另一個問題是它傾向於更均勻地分佈哪些索引頁必須在索引掃描上命中。這不一定是好事。 –

1

我會推薦的另一件事,雖然它有複雜的成本是考慮將你的系統中經常更新的部分移到像VoltDB這樣的東西。這會造成複雜性成本,而且您可能想要獲得商業許可/支持。但是,如果你有災難恢復功能,主存DB對這種負載的好處可能是值得的。然後您的PostgreSQL實例可以處理較長期的數據,而VoltDB可以處理實時處理。

+0

謝謝,我會研究一下voltDb。同時你的建議是將所有內容都記錄下來,或者至少有現場比賽的數據並且只有在完成時才保存它們,這是非常棒的。它將服務器執行速度提高到新的高度。 – arvind