Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2014, 08:30   #1
egordorichev
Пользователь
 
Регистрация: 22.10.2014
Сообщений: 12
По умолчанию Хранение мира в массиве

Добрый день! Я пишу игру аля Terraria. Уже работает генерация мира но ... Мир я храню в двумерном массиве и поскольку мир нужен большой (4800 * 2400), для массива не хватает памяти. В массиве храню единицы и нули.

Получается размер не очень большой, при попытке сделать его больше, при компиляции выдает ошибку сегментации. Можно ли как то увеличить массив? Заранее спасибо!

Код:
int world[500][2000];
Промежуточный результат:

egordorichev вне форума Ответить с цитированием
Старый 22.10.2014, 08:43   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
для массива не хватает памяти.
С утра, здесь всегда весело. Молодой человек, Вам не хватает 1 гига в оперативке? А память человека, по определению, всего полтора гига. Может и её не хватает?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 22.10.2014, 09:07   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,726
По умолчанию

Использовать для нулей и единиц инты.. кхм
Использовать для очень больших массивов не динамическую память... кхм
Вы уверены, что весь мир вам нужен одновременно? Его нельзя нарезать на страницы?
p51x вне форума Ответить с цитированием
Старый 22.10.2014, 09:31   #4
egordorichev
Пользователь
 
Регистрация: 22.10.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Использовать для нулей и единиц инты.. кхм
Использовать для очень больших массивов не динамическую память... кхм
Вы уверены, что весь мир вам нужен одновременно? Его нельзя нарезать на страницы?
Ну голова на это тему не варит, поэтому и прошу помощи Про страницы идея не плохая.

Мир мне нужно сгенерить и положить в файл. А потом только нужную часть в игру грузить

Последний раз редактировалось egordorichev; 22.10.2014 в 09:44.
egordorichev вне форума Ответить с цитированием
Старый 22.10.2014, 09:49   #5
egordorichev
Пользователь
 
Регистрация: 22.10.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
С утра, здесь всегда весело. Молодой человек, Вам не хватает 1 гига в оперативке? А память человека, по определению, всего полтора гига. Может и её не хватает?
Да не хватает. Но ведь проблема как то решается.
egordorichev вне форума Ответить с цитированием
Старый 22.10.2014, 10:24   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от egordorichev Посмотреть сообщение
Мир мне нужно сгенерить и положить в файл. А потом только нужную часть в игру грузить
Ну вы сами себе ответили почти.
На бумажке сделайте небольшой мирок, например 5х5 квадратиков - это будет наш большой мир. Теперь закрасьте в середине 2х2 квадратика другим цветом. Теперь на нарежьте ваш мир на полоски по 5 квадратиков и выстройте их в цепочку. Раскрашенные квадратики покажут вам как они будут расположены в файле. Тогда вы поймете как из большого мира вычитать только небольшой кусочек, т.е. откуда начать читать, сколько считывать и сколько пропускать.
waleri вне форума Ответить с цитированием
Старый 22.10.2014, 10:52   #7
egordorichev
Пользователь
 
Регистрация: 22.10.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Ну вы сами себе ответили почти.
На бумажке сделайте небольшой мирок, например 5х5 квадратиков - это будет наш большой мир. Теперь закрасьте в середине 2х2 квадратика другим цветом. Теперь на нарежьте ваш мир на полоски по 5 квадратиков и выстройте их в цепочку. Раскрашенные квадратики покажут вам как они будут расположены в файле. Тогда вы поймете как из большого мира вычитать только небольшой кусочек, т.е. откуда начать читать, сколько считывать и сколько пропускать.
Но это малюсенький мирочек! А вашу идею я и пытаюсь воплотить только уже на большом формате!
egordorichev вне форума Ответить с цитированием
Старый 22.10.2014, 10:57   #8
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Да не хватает. Но ведь проблема как то решается.
Вопрос. Где?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 22.10.2014, 11:03   #9
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Код:
int world[500][2000];
Неэкономно. Можно уменьшить размер массива в 32 раза для машины x86 или в 64 раза для машины x64, если использовать для хранения нулей и единиц массив типа bool

Код:
bool world[4800][2400];
x86
Для int. 4800 * 2400 = 11520000 интов. 1 int - это 4 байта. 11520000 * 4 байта = 46080000 = 46 МБайт. Неужели не хватает памяти для 46 МБайт?

Для bool. 4800 * 2400 = 11520000 бит. 1 бит равен 1/8 байт. 11520000 / 8 = 1440000 байт= 1.4МБайт. В сравнении с предыдущим вариантом в 46 МБайт, как раз, в 32 раза

x64
Для int. 1 int - это 8 байт. 11520000 * 8 байт = 92160000 = 92 МБайт. Сколько у вас памяти всего?

Для bool остаётся также: 1.4 МБайт, но разница теперь составляет в 64 раза

Вроде так получается. Поправьте, если ошибся

Вот вам пример:
Код:
#include <iostream>

int main()
{
    bool arr[10][10];

    arr[0][0] = 1;
    arr[0][1] = 0;

    std::cout << arr[0][0] << " " << arr[0][1] << std::endl;

    return 0;
}

Последний раз редактировалось 8Observer8; 22.10.2014 в 11:06.
8Observer8 вне форума Ответить с цитированием
Старый 22.10.2014, 11:31   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,068
По умолчанию

Пользуйте std::vector, у него для bool особая реализация.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Генерация мира O m n i s Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 29.10.2013 23:12
Хранение значений в массиве и их подсчет. manula Microsoft Office Excel 9 12.07.2013 14:47
Web карта мира mutabor Свободное общение 2 11.09.2009 22:19