Эффективный способ обработки больших мозаичных карт во время выполнения? - PullRequest
2 голосов
/ 15 марта 2012

Я кодирую двумерную игру для iPhone на основе плиток (ортогональных плиток). Все уровни генерируются процедурно при первом запуске приложения, а затем сохраняются до тех пор, пока пользователь не захочет новую карту. Карты довольно большие, имеют 1000 плиток шириной и высотой, а местность разрушаема. На данный момент это довольно похоже на Terraria , но это изменится.

Для хранения информации о карте / плитке в настоящее время я использую несколько двумерных массивов в стиле c. Это хорошо работает, но меня беспокоит количество занимаемой памяти, поскольку все массивы определены как short array[1000][1000], что занимает (1000 *1000* sizeof (short)) байтов пространства.

Это не особенно желательно, когда у iPhone нет невероятно большого объема памяти для работы, особенно когда пользователь многозадачен. Основная проблема заключается в том, что я не могу использовать определенный формат карты тайлов, например .tmx, потому что все уровни генерируются процедурно. Производительность также может быть проблемой, потому что если плитка уничтожается по индексу (x, y), то мне нужно изменить данные в этом индексе. Я также думал о записи данных карты тайла в текстовый файл, но думаю, что при доступе к данным или их изменении могут возникнуть проблемы или проблемы с производительностью.

Имея все это в виду, каким был бы эффективный и быстрый способ обработки моих данных тайла?

1 Ответ

1 голос
/ 15 марта 2012

Мне кажется, что это базовые данные, структурированные так, что каждый элемент мозаики имеет отношение к плиткам вокруг него. Здесь есть некоторые нетривиальные издержки, но преимущество заключается в том, что вы можете освобождать тайлы, которые не отображаются на экране, из памяти и возвращать их по ошибке, когда они вам нужны. По мере движения в направлении, вы можете запрашивать плитки в этом направлении, и вы можете довольно дешево выгружать память, когда вы находитесь в фоновом режиме. Это позволило бы избавиться от «нескольких» 2D-массивов и переместить все данные в один объект. В принципе, сетка может быть бесконечной по размеру, так как все зависит не от координат, а от отношений.

Вы можете аналогичным образом решить проблему, используя SQLite, запрашивая строки и столбцы в заданном диапазоне. Вы можете пометить объекты как NSDiscardableContent и поместить их в NSCache, что может значительно улучшить производительность памяти. Вы по-прежнему можете создавать эффективно-бесконечную сетку, если только вы разрешаете координаты быть положительными и отрицательными.

...