看板 GameDesign 關於我們 聯絡資訊
在前幾篇文章中我有提到網頁戰略遊戲的地圖設計 我想許多大型遊戲一定也都用到了類似的方法去規劃地圖在資料庫上儲存的方式 程式碼的部分我就不講解了 扣掉註解 實際有功能的程式碼為185行(沒併行) 想分享的原因其實蠻簡單的 只是想知道有哪些人也這麼做過 概念圖像下面那樣 把地圖依個人需求切割成好幾的地區存放 (?為你所設定的地圖區塊大小) (1,1)┌─┬─┬...─┐(x_end,1) │ │ │ │ (1,1*?)├─┼─┼...─┤(x_end,1*?) │ │ │ │ (1,2*?)├─┼─┼...─┤(x_end,2*?) │ │ │ │ . . . . . . . . . . . . (1,y_end)└─┴─┴...─┘(x_end,y_end) 概念: 因考慮到資料庫單一資料表的效能問題 所以地圖的資料寫入動態生成的資料表中 圖中的交會處 也就是每個資料表的交會處(邊緣) 我稱為節點 讀取時利用節點的計算來取得需要讀取的資料表 最後將資料取出排列就大公告成了 我有做地圖編輯器 所以可以動態生成存放地圖資料的資料表 這個1600萬格的地圖要花80分鐘才能跑完(InnoDB)...... 主要是寫入資料在花時間 整個陣列的產生其實只需要42秒 這是臨時的ip http://XXX.XXX.XXX.XXX/ (先拿掉) 會放個一天讓有興趣的人交流 不過全部的人共用一組資料 所以若同時很多人在操作的話 地圖的座標會跳很快或者亂跳 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.227.166.149
azureblaze:所以有點像是做Broad-Phase? 08/11 10:15
cowbaying:去查了資料 取值是用Broad Phase沒錯 08/11 10:25
adxis:有試過建 index嗎? 有 Rtree 之類的可以用 08/11 10:29
cowbaying:因為欄位複雜 所以直接放棄做索引 XDDDD 08/11 10:40
cowbaying:有做過全部索引 但是效能更差 08/11 10:40
※ 編輯: cowbaying 來自: 61.227.166.149 (08/11 10:49)
rofellosx:索引不管怎樣都要建 有無索引效能差很多. 08/11 11:00
※ 編輯: cowbaying 來自: 61.227.166.149 (08/11 16:50)
cowbaying:我找到問題了 之前設索引時MYSQL 的快取沒有設定好 08/11 17:46
cowbaying:建索引真的快蠻多的 08/11 17:46
adxis:mysql 有針對geograph 的 plug-in 雖然我不知道在遊戲地圖上 08/11 19:15
adxis:有沒有需要用到 FYI 08/11 19:15
akilight:indexing + hashing + B+tree, 可以試試 08/11 19:30
cowbaying:今天改良了一下 地圖資料動態產生 理論上可以無限大 08/11 21:12
cowbaying:不過這樣好像沒意義了 以戰略遊戲來說可能會玩不完... 08/11 21:43
darkflier:其實這種東西結合遊戲來做的話...可以用GPU去算...保證 08/11 22:58
darkflier:不管讀寫都低於16ms 08/11 22:58
cowbaying:最後資料還是要寫入硬碟吧 08/11 23:16
cowbaying:我用memory engine 可以低於5ms 08/11 23:20
cowbaying:其實計算出來的時間有90%都是寫入硬碟用掉的 08/11 23:21
7200轉的硬碟 平均搜尋時間大多落在12ms 再加上其他機械動作 讀寫一回大多是32ms 附近 我會把資料表做成動態生成還有一個因素 就是可以避免大量的資料寫入時資料表被鎖死的問題(同一個資料表) 雖然可以延遲寫入 但寫入的瞬間還是會卡死 不過這個問題還是要等實際跑過後再來做改善了 ※ 編輯: cowbaying 來自: 59.127.242.3 (08/11 23:38)
littlethe:資料處理的問題你已經處理得很好了 08/12 00:09
littlethe:何不把精力放在其他地方呢? 08/12 00:09
cowbaying:一不小心就陷入這個有趣的問題裡了 XDDDDDDD 08/12 00:25
cowbaying:因為遊戲架構的關係 幾乎全部的資料都是在地圖表裡運 08/12 00:27
cowbaying:算的 所以也算是個重點項目 08/12 00:27