• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

Как уменьшить использование памяти генератором мира

Участник
Участник
Статус
Оффлайн
Регистрация
8 Янв 2020
Сообщения
407
Реакции
219
Написал бесконечную генерацию мира для своего клона майнкрафта, но по моим подсчётам, если игрок прогрузит 10000 чанков, то игра сожрёт 6 гигов озу, что многовато. Есть ли способ уменьшить использование озу, не выгружая чанки?
 
Написал бесконечную генерацию мира для своего клона майнкрафта, но по моим подсчётам, если игрок прогрузит 10000 чанков, то игра сожрёт 6 гигов озу, что многовато. Есть ли способ уменьшить использование озу, не выгружая чанки?
Вроде в ориг майне чанки за пределом видимости не грузятся, сделай так же
 
Вроде в ориг майне чанки за пределом видимости не грузятся, сделай так же
у меня тож генерируются и рендерятся ток в пределах дальности прорисовки, но если долго бегать и сгенерить несколько тысяч чанков, то беда
 
Написал бесконечную генерацию мира для своего клона майнкрафта, но по моим подсчётам, если игрок прогрузит 10000 чанков, то игра сожрёт 6 гигов озу, что многовато. Есть ли способ уменьшить использование озу, не выгружая чанки?
А почему выгружать чанки сохраняя на диск не хочешь?
 
у меня тож генерируются и рендерятся ток в пределах дальности прорисовки, но если долго бегать и сгенерить несколько тысяч чанков, то беда
В майне вроде чанки прогруженные сохраняются на файл с картой а не в озу висят всё время, можешь тоже файл сделать и в него сохранять а в озу держать только прогруженные и при необходимости загружать из файла
 
В майне вроде чанки прогруженные сохраняются на файл с картой а не в озу висят всё время, можешь тоже файл сделать и в него сохранять а в озу держать только прогруженные и при необходимости загружать из файла
А почему выгружать чанки сохраняя на диск не хочешь?
мне было впадлу сохранение чанков в файлы писать, но я наконец то нашел силы это сделать
этот чанк был сохранен в файл внормальном мире, и загружен в пустом
в целом, это действительно решило проблему с использованием озу, только теперь другая проблема, сейв с 17000 чанков весит 5.7гб
1754852068298.png
 
мне было впадлу сохранение чанков в файлы писать, но я наконец то нашел силы это сделать
этот чанк был сохранен в файл внормальном мире, и загружен в пустом
в целом, это действительно решило проблему с использованием озу, только теперь другая проблема, сейв с 17000 чанков весит 5.7гб
Посмотреть вложение 312935
АХАХАХАХ ЧТО ЭТО ЗА НОГА
Ну чисто в теории ты можешь отслеживать, если чанк нетронут - выгружать его просто, а потом регенерировать по сиду
 
мне было впадлу сохранение чанков в файлы писать, но я наконец то нашел силы это сделать
этот чанк был сохранен в файл внормальном мире, и загружен в пустом
в целом, это действительно решило проблему с использованием озу, только теперь другая проблема, сейв с 17000 чанков весит 5.7гб
Посмотреть вложение 312935
Кубач дополнительно(по крайней мере раньше) использовал gzip сжатие для сжатия данных чанков, после появления 1.7.10 перешел на буквенные идентификаторы блоков и предметов но внутри сейвов сохранял блоки и предметы по айдишникам, а уже айдишники в свою очередь просто прописывались с текстовым идентификатором в отдельном глобальном файле для всего сейва что-бы место экономить

Помимо этого там была какая-то мутная штука с сжатием вплоть до пар битов, лайтмапа хранилась сжатой вместе с хейтмапой, метадаты блоков хранились в нибблах по 4 бита. Мб если захочешь исходники кубача найти ищи чет на подобии NibbleArray в minecraft -> world -> chunk пакетах
 
АХАХАХАХ ЧТО ЭТО ЗА НОГА
Ну чисто в теории ты можешь отслеживать, если чанк нетронут - выгружать его просто, а потом регенерировать по сиду
это хацуне мику
красава
222d612b9359d03d.png

Кубач дополнительно(по крайней мере раньше) использовал gzip сжатие для сжатия данных чанков, после появления 1.7.10 перешел на буквенные идентификаторы блоков и предметов но внутри сейвов сохранял блоки и предметы по айдишникам, а уже айдишники в свою очередь просто прописывались с текстовым идентификатором в отдельном глобальном файле для всего сейва что-бы место экономить

Помимо этого там была какая-то мутная штука с сжатием вплоть до пар битов, лайтмапа хранилась сжатой вместе с хейтмапой, метадаты блоков хранились в нибблах по 4 бита. Мб если захочешь исходники кубача найти ищи чет на подобии NibbleArray в minecraft -> world -> chunk пакетах
спасибо за информацию, но я хочу полностью сам игру написать, без декомпила ориг майна, попробую разные методы сжатия потыкать
 
спасибо за информацию, но я хочу полностью сам игру написать, без декомпила ориг майна, попробую разные методы сжатия потыкать
Понял, тогда удачки!
Я сам свой клон писал до момента когда пришлось внезапно учить ПДД в кратчайшие сроки, там от кубача тоже минимум перенимал и хотел вместо gzip использовать LZ4 из-за скорости (ну и я на джаве пишу а не на плюсах, поэтому в целом скорость довольно важный аттрибут), до сохранения мира не дошел, за то сделал его зацикленным :3
 
Понял, тогда удачки!
Я сам свой клон писал до момента когда пришлось внезапно учить ПДД в кратчайшие сроки, там от кубача тоже минимум перенимал и хотел вместо gzip использовать LZ4 из-за скорости (ну и я на джаве пишу а не на плюсах, поэтому в целом скорость довольно важный аттрибут), до сохранения мира не дошел, за то сделал его зацикленным :3
спасибо
на плюсах тож скорость важна, тк если написать сохранение через жопу, то зависнешь на минут 5 при сохранении большого мира, я уже работаю над оптимизацией
ты сам мир сделал зацикленным?
 
ты сам мир сделал зацикленным?
Да, я это через маленькую штуку сделал (ну отделив логику от мира), которая по сути для мира округляет значения чанков и делает им условный abs (для чисел в степени двойки) и крч просто по кд делаю такое округление делаю при вызовах, учитывая то что это всего-лишь a & (b - 1) то это практически никак не влияет на нагрузку
Для камеры временно тоже использовал его-же (прост туда похожую функцию с флоатом закинул), но пока не оч получилось прикинуть чем это можно заменить что-бы было адекватно (ну тип common-фичи у которых фичи чисто для клиента, ну такое)
По итогу это прост выглядит чет около такого (x >> block_to_chunk_shift) & (world_chunk_size - 1)
 
Да, я это через маленькую штуку сделал (ну отделив логику от мира), которая по сути для мира округляет значения чанков и делает им условный abs (для чисел в степени двойки) и крч просто по кд делаю такое округление делаю при вызовах, учитывая то что это всего-лишь a & (b - 1) то это практически никак не влияет на нагрузку
Для камеры временно тоже использовал его-же (прост туда похожую функцию с флоатом закинул), но пока не оч получилось прикинуть чем это можно заменить что-бы было адекватно (ну тип common-фичи у которых фичи чисто для клиента, ну такое)
По итогу это прост выглядит чет около такого (x >> block_to_chunk_shift) & (world_chunk_size - 1)
интересно, а я просто генерирую чанки вокруг игрока в отдельном потоке, если они не прогружены
получается псевдобесконечный мир, с единственным ограничением в лице твоей оперативной памяти и места на диске
 
интересно, а я просто генерирую чанки вокруг игрока в отдельном потоке, если они не прогружены
получается псевдобесконечный мир, с единственным ограничением в лице твоей оперативной памяти и места на диске
Типо как у кубача, с лимитом в виде точности чисел из-за рандома/их лимита по размеру мира в блоках?

У меня фича прост в том, что миры все будут маленького размера (512x512, 1024x1024 к примеру), но они будут зацикленные и они будут процедурно прост генерится и между ними можно будет спокойно перемещаться (привет starbound 😭)
 
Типо как у кубача, с лимитом в виде точности чисел из-за рандома/их лимита по размеру мира в блоках?

У меня фича прост в том, что миры все будут маленького размера (512x512, 1024x1024 к примеру), но они будут зацикленные и они будут процедурно прост генерится и между ними можно будет спокойно перемещаться (привет starbound 😭)
у меня даже лимита на размер мира в блоках нет, все упирается исключительно в размер 64битного числа, но генератор начнет сходить с ума гораздо раньше, так что как то так
 
Удалось оптимизировать время загрузки мира до миллисекунд и получилось уменьшить размер файла чанка с 700кб до 33кб даже без сжатия (и до 8кб с сжатием). Спасибо @beer007 за идею.
 
Назад
Сверху Снизу