Около
На самом деле это два вопроса в одном. Прежде всего, я ищу способ эффективно хранить большие объемы данных. Другой аспект связан с запросом набора данных и отображением тайлов. Позвольте мне сначала дать вам некоторое представление.
Мы делаем браузерную многопользовательскую игру для магнатов, используя библиотеку CraftyJS для рендеринга в Canvas. На фоне графического интерфейса мы запускаем Yii Framework на PHP, и все это подключается к генератору случайных карт Python и игровому движку.
Вот как выглядит первый грубый рендер карты: http://i.imgur.com/khAXtl.png
Хранение картографических данных
Мир игры генерируется случайным образом при каждом запуске игры. Размер 100x100 гексагональных плиток для каждого игрока. Это означает, что для игры с тремя игроками создано 90 000 плиток. В настоящее время я просто создаю массив JavaScript, из которого я отображаю карту.
Это прекрасно работает для рендеринга, но для любого вида взаимодействия с картой нам нужно хранить информацию о том, какой игрок владеет плиткой, какая структура строится поверх нее, какова ее текущая цена и так далее. Сначала, по крайней мере для прототипа, мы хотели использовать MySQL, но после некоторого тестирования он работает не так быстро, как хотелось бы. Может быть, хранилище объектов, такое как MongoDB, лучше подходит для хранения данных тайлов, а не таблиц SQL. Или может быть что-то еще?
Отображение карты
Еще одна проблема, которую я вижу, это перемещение по карте. В настоящее время я создаю хитроумные объекты для каждой плитки, даже если ее нет в окне просмотра. Это медленно, потому что, хотя Crafty рендерит только те, которые находятся в окне просмотра, он сохраняет и, возможно, перебирает все тайлы в каждом событии рендеринга. В настоящее время у меня есть нарисованная карта, которая загружается очень медленно и заикается при перемещении, теперь я хотел бы сделать ее играбельной.
Моей первой идеей было загрузить отображаемое подмножество плиток, которые находятся в области просмотра. Но когда игрок переместит окно просмотра в пустую область, мне нужно будет запросить сервер и дождаться ответа, только тогда карта будет отображена. Это было бы хорошо в нативном приложении, но оно запаздывает в веб-игре.
Чтобы получить плавную производительность от карты, можно предварительно загрузить большее подмножество плиток в массив javascript и использовать его в качестве кэша. У игрока было бы несколько экранов, «кэшированных», и когда он перемещал окно просмотра, я загружал больше плиток в «кеш» JS.
Я направился в правильном направлении? Я хотел бы получить больше информации от кого-то, кто сделал что-то подобное. Я новичок в разработке игр, но за последние пару недель просматривал множество источников.