簡體   English   中英

node.js存儲游戲狀態,怎么樣?

[英]node.js storing gamestate, how?

我正在用javascript編寫一個游戲,並且為了防止作弊,我正在服務器上玩游戲(這是一個像更復雜的棋子的棋盤游戲)。 由於游戲相當復雜,我需要存儲游戲狀態以驗證客戶端操作。

是否可以將游戲狀態存儲在內存中? 這很聰明嗎? 我應該這樣做嗎? 如果是這樣,怎么樣? 我不知道那是怎么回事。

我也可以存儲在redis中。 這種事情對我來說非常熟悉,不需要解釋。 但是如果我存儲在redis中,問題在於,在每一次移動中,游戲都需要從redis獲取數據並解釋和解析該數據,以便從頭開始重新創建游戲狀態。 但由於動作頻繁發生,這對我來說似乎非常愚蠢。

我該怎么辦?

如果你真的,真的不想要I / O的開銷,那么只需將游戲狀態存儲在由游戲ID鍵入的全局對象中:

var global_gamesate = {}

然后在每個連接上檢查游戲ID是什么來檢索他的游戲狀態:

var gamestate = global_gamestate[game_id];

據推測,您已經有了一種將客戶端會話映射到游戲ID的機制。

通常,游戲狀態很小,幾乎不會占用太多RAM。 讓我們感到悲觀,並假設每個游戲狀態占用500K。 然后,您可以為服務器上的每GB內存服務兩 百萬 個游戲(如果我們假設每個游戲有兩個用戶,則可以投入四 百萬 用戶)。


但是,我想指出像MySQL這樣的數據庫已經實現了緩存(可配置),因此加載最常用的數據基本上是從RAM中加載的,具有次要的套接字I / O開銷。 數據庫的優點是,您可以擁有比RAM更多的數據,因為它們將其余數據存儲在磁盤上。

如果您的程序到達負載,您開始考慮編寫自己的磁盤序列化算法來實現交換文件,那么您基本上是在重新發明輪子。 在這種情況下,我會說去數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM