2010-09-19 77 views
4

我目前正在製作基於瓷磚的MMORPG,並且試圖找到一種存儲大型2D遊戲世界的好方法(至少1000平方的瓷磚,但希望更像一些一千平方)。這個想法是鼓勵人們在共享的地圖上創建他們自己的城市,用戶將能夠建造房屋和商店,從而可以編輯瓷磚並與某些鏈接表具有一對多的關係。我正在考慮將它們發送到64x64瓷磚塊的客戶端。在線多人遊戲中存儲基於大型瓷磚的地圖

我現在有它的PHP/MySQL的工作,我的表是這樣的:

CREATE TABLE `fbmmo`.`tiles` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `x` int(11) NOT NULL, 
    `y` int(11) NOT NULL, 
    `realm` varchar(45) NOT NULL, 
    `image_id` varchar(45) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `Index_X` (`x`), 
    KEY `Index_Y` (`y`) 
) ENGINE=InnoDB AUTO_INCREMENT=4327236 DEFAULT CHARSET=latin1; 

和查詢大致是

select * from tiles where x<1000 and y<1000 and x>936 and y>936; 

當我只有大約50萬條記錄只需要大約半秒鐘,但是當我達到大約400萬條記錄時,大約需要5秒鐘,我相信有一些方法可以改善這一點。

我可以通過緩存地圖請求來避開它,但我想知道是否有更好的配置數據庫的方法,以及是否有人有效存儲大型二維遊戲世界的技巧?

感謝您的時間

+1

嘗試在('x','y')上添加索引。 – joschi 2010-09-20 05:36:18

回答

0

,也許你可以大塊在數據庫級別已經是瓷磚?

+0

我有其他表格鏈接到瓷磚的ID,如npcs表和項目表等。如果我將它們分塊,我會丟失這些ID,並且如果我只需要更新一些瓦片就更難更新瓦片。 但是我可以讓npcs/items/etc在x和y上輸入密鑰而不是tile_id,但我不知道這是否是最好的解決方案 – digi 2010-09-19 06:09:18

0

只是我的小2分。也許,根據ppl如何滾動地圖,您可以預取下N個可見的64x64拼貼集。關於image_id varchar(45)NOT NULL, 的一個小問題你確定要在每個tile中存儲領域嗎?不能想象它有什麼好處。

+0

我目前正在預取下一個圖塊集,它只是其花時間而我擔心如果我的遊戲受歡迎,它將如何處理高負載。這個領域就在我未來想要做的事情 – digi 2010-09-19 07:23:52

1

隨着數據集的大小增加,範圍查詢可能非常快速地失去控制。你可能想看看這方面的一些文獻。這裏有一些有趣的論文。

範圍查詢的數據結構:

http://portal.acm.org/citation.cfm?id=1035798

www.siam.org/proceedings/soda/2010/SODA10_014_yuanh.pdf

算法快速搜索

www.cccg。 ca/proceedings/2005/3.pdf