2012-10-13 99 views
2

我們都知道的MMO遊戲的流行趨勢。球員彼此面對面生活。但是在遊戲過程中存在SQL插入和查詢的巨大流量,低於提高遊戲性能C#

  • 給出每頁顯示12分鐘或500個播放器/小時
  • 有平均/最低100場比賽在網上游戲進度表中,我們存儲每個玩家移動
    • 12 4播放機的輪比賽可以有48條記錄
    • 加上咒語或特殊項目
    • 總共96個每錦標賽或48000每小時記錄插入件圍繞相同數量的(500名玩家/小時)

在效應初探我剛纔的問題(Improve MMO game performance),我改變了架構和我們沒有直接寫入到數據庫中。

而是積累在DataTable所有值。然後,該過程每當DataTable具有100K以上的行(其有時甚至可以在一小時內)寫入到CSV格式的文本文件。另一個經常掃描CSV文件的後臺應用程序讀取任何可用的CSV文件並將信息存儲到服務器數據庫中。

問題

  1. 我們可以訪問數據表存在於遊戲應用的從另一個應用程序,直接(它讀取數據表並清除已經閱讀記錄)。爲了代替從磁盤寫入和讀取,我們直接從內存讀取和寫入。

  2. 是否有更快的是數據表,可容納大量的數據,但在整理和更新操作相當快的任何方法。因爲我們必須頻繁地掃描用戶名,更新遊戲狀態(幾乎每個插入)。它可以是一個高速緩存工具或快速 掃描/搜索算法甚至CollectionModel。現在,我們使用foreach循環遍歷DataTable中的所有記錄,並在用戶存在時更新行。如果沒有,那麼我們創建一個新的行。我嘗試使用SortedList和班級,但隨後它不僅加倍努力,內存使用率增加極大地減慢整體的遊戲性能。

感謝

阿文德

+1

一)http://stackoverflow.com/a/981824/284240 –

+1

是否使用了strogly類型化的DataSet或常規'的DataSet/DataTable'?你有沒有設置['PrimaryKey'](http://msdn.microsoft.com/en-us/library/system.data.datatable.primarykey.aspx)?然後,您可以非常有效地通過鍵找到行(http://msdn.microsoft.com/en-us/library/y06xa2h1(v = vs.80).aspx)。 –

+0

這是一個傳統的模型。是的,我們有一個主鍵 – arvind

回答

1

好吧,讓我們回答:

  1. 可以在應用程序之間共享對象,使用遠程處理 - 但它是慢得多,並且使代碼可讀性較差。但是,你有另一個解決方案,所以你會繼續處理內存。你可以使用MemoryMappedFiles,所以所有的工作將實際上使用內存,而不是磁盤:http://msdn.microsoft.com/en-us/library/dd997372.aspx

  2. 你可以使用NoSQL DB從某種(有很多在那裏:Redis,MongoDB,RavenDB) - 所有他們基於鍵值訪問,你應該測試他們的性能。更好的是,這個數據庫的一些是持久的,可以用於多個服務器。

希望這會有所幫助。

+0

我正在尋找memorymappedfiles,但我不能有一個新的測試數據庫。 – arvind

+0

我會第二次使用像Redis這樣可以堅持的快速緩存層,在考慮未來的可伸縮性時,這往往是這種場景中的最佳解決方案 – Milney

1

使用內存緩存會提高你的表現