2012-03-20 86 views
4

一個小團隊的程序員和我正在開發一個帶有大型方形世界地圖的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之外的選項,這將是更快,例如將其存儲在,這也是一個有效的答案在服務器上的本地文件,但是我想某種解釋,爲什麼它會在這些條件

    我意識到,這不是一個簡單的問題,並會感激你也許能夠給

  • +0

    我不清楚爲什麼你要將它存儲在MySql中,而不僅僅是你自己的文件系統在某個文件系統上的文件格式......你將永遠不會更新數據,使用地圖構建查詢,報告關閉地圖細節等等......看起來像把MySql引入混合中,這使得它複雜化。 – 2012-03-20 16:20:44

    +0

    如果我們將它存儲在一個文件中,我們必須將整個文件加載到php內存中,並讀取到存儲數據的位置,並對數據的每個請求再次執行此操作。我的理解是,如果表格結構正確,MySQL會更快。如果這不是這種情況,請隨時糾正我 – Ryex 2012-03-20 16:24:28

    +0

    如果地圖足夠小以適應php內存,那麼我認爲這會比查詢MySql的信息快得多。我對php知之甚少,但我假設你有一個類似於散列表的數據結構,你可以用它來檢索信息,這可能是最快的解決方案。但是,我不會根據性能做出這個決定......我會選擇更簡單的實現方式,然後在必要時從那裏進行優化。 – 2012-03-20 16:31:42

    回答

    1

    個人的任何幫助,我會表出來像這樣下更快。

    地圖圖塊

    id - primary key 
    mapId - indexed 
    xCoord - indexed 
    yCoord - indexed 
    tileId 
    

    地圖

    id - primary key 
    tileSetId 
    

    活動

    id - primary key 
    mapId - indexed 
    xCoord - indexed 
    yCoord - indexed 
    proceeduralInstructions 
    

    重要的事查詢速度的指標。我在Map Tiles表中添加了mapId,以便可以在此表中存儲多個地圖。地圖表格可以保存地圖特定的信息,比如你用來繪製地圖的tileset(圖像)。事件可以在渲染時添加到地圖上。你可能會想出一個簡短的程序指令,直接放入數據庫,這可以由引擎解釋。您可能還會爲精靈添加另一個表格,並且可能會爲您的地圖平鋪表格添加另一個表格,以指定要繪製的圖層(有些東西會顯示在角色的前面,而另一些則會顯示在角色的後面)。您甚至可能需要兩個前景圖層和兩個背景圖層,以便您可以將部分透明度的圖像疊加在一起以獲得更豐富的地圖。

    +0

    感謝您解釋爲什麼要使用此選項。據我所知,我們永遠不需要存儲多個地圖,但這非常有用。我將它提供的索引屬性提供給將用於獲取所涉及的磁貼的字段是查找速度的主要來源? – Ryex 2012-03-20 16:41:24

    +0

    @Ryex是的,基本上它減緩了向數據庫添加新記錄的過程,因爲它必須重新索引列,但它將查找速度提高了許多倍。你會注意到擁有多個地圖可能是一件好事,因爲這可以讓你在不同地區(即一個森林地區的一個地圖集,一個沙漠地區的地圖集等)擁有不同的地圖集(圖片)必須同時加載所有的tilesets。 – dqhendricks 2012-03-20 16:49:28

    +0

    @Ryex在開始創建我自己的遊戲後,我正在考慮將整個地圖作爲無模式JSON數據存儲在中等Blob中的選項,這使我可以隨時進行更改以映射數據,並具有更快的讀取/寫入和較少的索引。但是限制是我絕對想要將每個區域分隔成多個地圖,因爲每個地區必須一次從數據庫中全部加載。 – dqhendricks 2012-04-22 17:59:39

    相關問題