@Mackaron

Как создать 2д мир?

Я решил создать свою 2д игру, начал продумывать её, но когда я начал думать о том, как будет храниться информация о каждой клетке в игре (мир будет состоять из 1 млн клеток), я пришёл в замешательство. Подумал о том, чтобы храниться всё в массиве, но это будет заниматься слишком много памяти, а других способов я не могу придумать.
  • Вопрос задан
  • 280 просмотров
Решения вопроса 2
Зависит от того, какие именно атрибуты у этих клеток есть.
Магии не существует - придётся как-то хранить информацию о каждой клетке.

1. Если массив (не куча и не хэш-таблица) - можно немного сэкономить и точно не хранить координаты клетки, тк они и так вытекают из позиции элемента.

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

PS: 1млн клеток, даже если считать, что на каждую клетку нужно 8 байт, а не 1бит - это меньше 8мбайт.
Ответ написан
Комментировать
Deita
@Deita
Конечно, линейно массивом не надо такое делать. Для такого прекрасно подходит Linked Lists. Вам не важно будет в каком порядке хранится информация в памяти, и можно будет всегда вносить изменения. Также можно нужную информацию подгружать динамически, и освобождать за ненадобностью. Вам так не придется дублировать весь массив, для внесения коррективов динамически. Хотя в вашем случае где всего 1 млн. клеток, то можете и дублировать хоть на по фреймово. Видеопамять очень шустрая. Но все же логичнее будет использовать списки. Но придется платить указателями, лишним размером. Хотите действительно ответ, то слушайте, попробуйте сделать хоть чтото, не думая об оптимизации, и показать что сделали, и что не получилось, больше конкретизировать, потому что программистов надо спрашивать более конкретизировано чтолибо. И еще раз, не думайте об оптимизиации, постарайтесь сделать так, как уже задумали, и потом спросите как можно оптимизировать. И вам подскажут, просто теоретиков никто не любит, слишком дофига их. Ваш вопрос обидятся и удалят так как не смогут ответ найти. Конкретизируйте, делайте, так как задумали, ну задумали скажем 1 миллион, ну и что с того! Попробовали засунуть в память и оно не влезло чтоли? Нет, не пробовали, испугались, зачемто, а просто попробуйте для начала, что разве появится ошибка какаято. Сейчас той памяти в любом китайском смартфоне по несколько гигабайт. И да, попробуйте на 1 фрейм дублировать весь массив. Сейчас такие скорости и размер что хоть 1000 fps можно получать в 3D не говоря уже об 2D. Потому не бойтесь компьютеру в лоб давать любой свой код даже если он кажется медленно работающим, компьютер тупой как валенок, но настолько шустр что трудно даже уже стало вообразить, он схавает все что угодно, тем более ваш массив в 1 миллион. Если речь не про скроллер а речь про матрицу размером в 1 терабайт, тогда без процесса кеширования не обойтись.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
mayton2019
@mayton2019
Bigdata Engineer
Нет необходимости отслеживать состояние сразу всех 2х миллионов. В старых 2д играх слешерах 90х например уровни тоже были очень богатые на количество enemies но их не нужно было обрабатывать и хранить всех сразу. По сути игрок видел view-port размером с экран и игровому движку нужно было активировать рождение объектов-персонажей почти у границы экрана. Когда персонаж покидал экран - его можно было либо удалить либо поставить на паузу. Этим пользовались почти все движки и экономили ресурсы.

Если речь идет допустим о клеточных автоматах - то там тоже есть свои оптимизации. Можно расчитывать эпохи параллельно используя опции параллелизма железа например. Или объединять близко стоящие кластеры клеток и обабатывать отдельно чтобы предотвратить расчет всего экрана. Тут нет предела совершенству. Можно брать такие индексы как Q-Tree/R-Tree для быстрого трекинга этих областей.

В некоторых играх типа Age Of Empires или Cossacks можно было рассматривать в качестве единицы расчета не каждого пехотинца или всадника а целые фаланги. Этим пользовались особенно когда боевые
единицы ходили в построении.

Вобщем игровые движки - это не симуляторы физики. Это - скорее очень хитрая иллюзия. И талант геймразработчика как раз и состоит в том чтобы игроку казалось что он видит миллион объектов а с точки
зрения игрового алгоритма - это будет просто один прямоугольник из целых чисел или каких-то других
объектов.
Ответ написан
Steel_Balls
@Steel_Balls
0L3QsNGH0LjQvdCw0Lsg0YEgQkFTSUMg0L3QsCDQo9Ca0J3Qpi
Да, в массиве.
но это будет заниматься слишком много памяти

"слишком много" - это сколько? как ты считал?
1 млн клеток - это 1 млн бит, это всего лишь 1/8 мегабайта
Ответ написан
saboteur_kiev
@saboteur_kiev Куратор тега Разработка игр
software engineer
1 млн байт, это например всего лишь 1 мегабайт, что для современного компьютера немного.
Ты точно в КАЖДОЙ клетке хочешь разместить нечто активное?
Ответ написан
Bagadan
@Bagadan
Я богдан
Можно использовать сиды например в нампай при создании рандома можно вписать сид,просто создаешь алгоритм по созданию рандомного мира перебираешь сиды и при запуске игры мир будет пересоздаватса
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы