Динамическая загрузка карт в «движке тайлов» - PullRequest
2 голосов
/ 16 октября 2011

Я реализую движок плиток для игр, использующих C ++.В настоящее время игра разделена на карты, каждая карта имеет двумерную сетку спрайтов, каждая из которых представляет плитку.

Я кодирую систему, в которой, если несколько карт являются смежными, вы можете переходить с одной на другую.При запуске игры все карты создаются, но «выгружаются», то есть объекты спрайтов не находятся в памяти.Когда я нахожусь достаточно близко от соседней карты, спрайты карт «загружаются» в память, выполняя следующие действия:

for(int i=0; i < sizeX; i++) {
    for(int j=0; j < sizeY; j++) {
        Tile *tile_ptr = new Tile(tileset, tilesId[i][j], i + offsetX, j + offsetY);
        tilesMap[i][j] = tile_ptr;
    }
}

И они выгружаются при уничтожении таким же образом, когда я слишком далеко откарта.

Для карты спрайтов 50x50 размером 32x32 пикселя загрузка или выгрузка занимает примерно 0,3 секунды, что выполняется в течение 1 кадра.Мой вопрос: что является более эффективным способом динамической загрузки / выгрузки карт, даже используя совершенно другой механизм?спасибо

PS: я использую SFML в качестве графической библиотеки, но я не уверен, что это что-то меняет

Ответы [ 2 ]

3 голосов
/ 16 октября 2011

Отличается от улучшение задержки , но увеличит общее количество необходимых операций:
Вместо того, чтобы ждать, когда вы «слишком близко» или «слишком далеко» от карты, сохраните в памяти карты для большего квадрата вокруг игрока [т.е. если карта 50x50, хранить 150x150], но показывать только 50x50. Теперь, каждый шаг - вычислите новую карту 150x150, для этого потребуется 150 операций уничтожения и 150 операций построения на каждом этапе.

Поступая так, вам действительно нужно будет вычислять и создавать / уничтожать элементы больше раз! Но задержка улучшится, поскольку вам не нужно ждать 0,3 секунды для построения 2500 элементов, поскольку вам всегда нужна небольшая часть: 150 * 2 = 300 элементов.

2 голосов
/ 16 октября 2011

Я думаю, что это прекрасный повод для изучения многопоточности и асинхронных вызовов.
Это может показаться сложным, если вы новичок в этом, но это очень полезный навык.
Загрузка все равно займет 0,3 секунды (ну, на самом деле, немного больше), но игра не остановится.
Это то, что делают большинство игр. Вы можете искать в SO различные способы сделать это в C ++.

...