一個小團隊的程序員和我正在開發一個帶有大型方形世界地圖的MMO瀏覽器遊戲,其中每個索引(x,y)指的是地圖上的一個圖塊。每個瓦片都有一對值來存儲地形類型ID和隨機生成的種子,這些種子將用於程序生成。該地圖將在1500x1500至500x500平方米的範圍內。有效的方法來存儲二維數組/數據表中的數據,以便從PHP快速訪問
我們需要一種有效的方式將此表存儲在服務器上,最好是存儲在SQL數據庫中,以便可以訪問較小的地圖塊並將其發送到播放器供瀏覽器呈現。
以下條件對於訪問地圖數據總是如此。一旦它被存儲在數據庫中
- 地圖數據將永遠不會被更新 地圖
- 只有小的矩形部分的部分將在任何給定的查詢要訪問從一個單一的瓷磚,以在最大50×50平方的表
考慮到這些條件,將我們的選擇是什麼在MySQL數據庫中存儲數據,以便訪問數據的矩形部分將是快速,無論da如何,最好是相同的速度ta在桌上的位置?
我們的小組成員來到了佈局SQL表的這種方法,其中的每一行是在地圖圖塊:
|------------------------------------------------------------|
| table: map |
|------------------------------------------------------------|
| coord | tile | attrs | seed |
|------------------|----------------|-------|----------------|
|mediumint unsigned|tinyint unsigned| text |tinyint unsigned|
| unique index | | | |
|------------------|----------------|-------|----------------|
- 座標:X和Y座標的組合在世界地圖上的瓦片。通過
X + (Y<<11)
爲1500x1500地圖計算。 (請注意,50×50的測試圖,使用X + (Y<<6)
) - 瓦:瓦塊的地形類型的數字ID
- ATTRS:我們需要存儲修改瓷磚的任何屬性,
- 種子:對於瓷磚
沒有我們的團隊成員都與SQL表的設計經驗,所以我們有沒有知道的方式,如果這是一個很好的方法,或者是什麼瓶頸或SL隨機生成的種子我們正在尋找一個答案,在我們的表格的設計中提供我們的選項,以及選擇每個選項的優缺點是什麼。此外,如果你真的很好,從數據庫中拉出地圖的矩形塊的示例查詢(如從(0,0)到(5,5))會很好。
編輯如果MySQL之外的選項,這將是更快,例如將其存儲在,這也是一個有效的答案在服務器上的本地文件,但是我想某種解釋,爲什麼它會在這些條件
我意識到,這不是一個簡單的問題,並會感激你也許能夠給
我不清楚爲什麼你要將它存儲在MySql中,而不僅僅是你自己的文件系統在某個文件系統上的文件格式......你將永遠不會更新數據,使用地圖構建查詢,報告關閉地圖細節等等......看起來像把MySql引入混合中,這使得它複雜化。 – 2012-03-20 16:20:44
如果我們將它存儲在一個文件中,我們必須將整個文件加載到php內存中,並讀取到存儲數據的位置,並對數據的每個請求再次執行此操作。我的理解是,如果表格結構正確,MySQL會更快。如果這不是這種情況,請隨時糾正我 – Ryex 2012-03-20 16:24:28
如果地圖足夠小以適應php內存,那麼我認爲這會比查詢MySql的信息快得多。我對php知之甚少,但我假設你有一個類似於散列表的數據結構,你可以用它來檢索信息,這可能是最快的解決方案。但是,我不會根據性能做出這個決定......我會選擇更簡單的實現方式,然後在必要時從那裏進行優化。 – 2012-03-20 16:31:42