2017-03-22 70 views
1

我正在創建一個基於僞回合的在線策略瀏覽器遊戲,其中許多人在相同的世界中玩了很長時間(幾個月)。爲此,我想要有64000x64000瓦片= 40億瓦片的地圖。我需要每塊瓷磚大約6-10個字節的數據,總共大約30GB的數據用於存儲地圖。用於存儲巨大瓷磚地圖的選項

每瓦應該有這樣的類型(水,草,沙漠,山地),資源(木材,牛,金)和playerBuilt(道路,建築物)

客戶端將只需要大約訪問屬性100x100瓷磚在同一時間。

我已經處理了客戶端控制下的地圖。我面臨的問題是如何在服務器端存儲,檢索和修改此映射中的信息。

所需的功能:

  1. 創建,存儲和修改64000x64000 tilemap的。
  2. 向客戶端顯示地圖的100x100部分。
  3. 在地圖上進行修改,例如道路,建築物和耗盡的資源。

我至今認爲:

  1. 程序生成:在程序上取其所需的飛行地圖的一部分生成。確保給定相同的種子,它總是生成相同的地圖。我遇到的主要問題是遊戲過程中會對地圖進行修改。注意:在遊戲過程中,少於1%的圖塊會被修改,並且可以將座標修改存儲在外部數組中。將它們加載到程序代之上。
  2. 數據庫:在遊戲開始時生成地圖並將其存儲在數據庫中。一位朋友告訴我這樣一個巨大的瓷磚地圖,並告訴我,我可能想將它存儲在內存中。
  3. 將所有內容保留在服務器端的內存中:將其保存在內存中的數據結構中。看起來像是一個很好的方式來做到這一點,如果地圖較小,但是40億個地圖塊要記憶很多。

我打算使用java + mysql作爲此項目的後端。如果需要,我仍處於早期階段,可以開始改變技術。

我的問題是:哪三種方法上面似乎可行的和/或有其他辦法做到這一點,我還沒有考慮過?

+1

歡迎來到SO!您可能會爲這個問題得到一些有用的答案,但總的來說,這個網站實際上太寬泛了。正確的答案將取決於數十個關於遊戲設計的因素。如果您可以更具體地瞭解您在每個解決方案中看到的問題,並詢問如何解決問題,那麼您可能會獲得更好的信息。如果你對此太寬泛,不要感​​到驚訝。 – sprinter

+0

每個瓷磚大約有多少數據?每個瓷磚8位的解決方案將與每個瓷磚1 mb大不相同... – Pikalek

+0

Sprinter - 感謝您的歡迎,我會盡力讓它在未來更加簡潔。 Pikalek - 每個瓷磚大約有16個字節的數據。 – ChooseTheRedPill

回答

0

依賴於:

  • 多少RAM了(或者播放器/用戶得到了)
  • 是最小塊映射的空(疏)?相對密集。
  • 是否有一個默認的地形(如空或水?)

如果稀疏,使用HashMap,而不是一個二維數組的。

如果密集的將是更大的挑戰,你可能需要使用一個數據庫或者一些特殊的數據結構+緩存。 您可以檢測熱點區域並將其保存在內存中一段時間​​,死區(沒有玩家,沒有活動......)可以存儲在數據庫中並按需讀取。 您也可以通過多次傳遞加載數據:首先是地形,然後是其他對象......每個圖層都可以以不同的方式存儲。例如,地形可能是柏林噪音產生+另一層可以修改。