Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 27.01.2017
Сообщений: 52

Устройство работы игр с блоками, такими как mincraft или terraria

15.09.2019, 20:08. Показов 1649. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я довольно давно пытаюсь сделать игру в таком жанре, но никак не могу правильно оптимизировать. Для того, что бы сделать блок, я раньше всё время для отдельного блока создавал свой экземпляр класса нужного блока. Но через некоторое время мне стало интересно, как это всё работает у профессионалов, например у разработчиков mincraft. Для этого я посмотрел на работу их кода. Я не смог понять общей картины, но кажется смог понять концепцию работы майнкрафт, а конкретно создания блоков и их обработки. Вообщем, на сколько я понял, они не создают отдельных экземпляров блоков, а хранят информацию о них в массиве данных с типом byte. И уже из этого массива данных они получают информацию о блоках, затем обрабатывают её и рисуют блок. Для обработки они используют экземпляры блоков, в которых хранится вся инфа, что делать с этими данными из массива. Например byte[81, 1, 2, 1, 15]. 81 - id блока(кактус). Программа переходит в класс кактуса и понимает от туда, что следующая цифра "1" показывает время, которое уже растёт кактус, то есть 1 день. Цифра "2" показывает скорость роста. "2" и "254" - это одно число в 256-ричной системе счисления. Программа переводит его в 10-ричную систему и получает число 271 - количиство блоков воды в 1 чанке(к примеру). Если бы id было бы не 81(кактус), а например 54(ступенька), то расчёт был бы уже другим, который брался бы из этого блока. Так вот, у меня единственный вопрос: прав ли я в своих рассуждениях? Если нет, то почему? Спасибо за ответ!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.09.2019, 20:08
Ответы с готовыми решениями:

Как пользоваться функциями работы с файлами такими как fileExists CanCreatefile
кто нибудь может написать небольшие программы, что бы понять как пользоваться функциями работы с файлами такими как fileExists ...

"Ваш компьютер или устройство необходимо восстановить Требуемое устройство не подключено или не доступно 0xc000000e"
После установки в ноут Dell ssd вместо hdd и перемещения hdd на место dvd рома - накатил Вин10 на ссд, а на хдд стоит Вин8. 10ка штатно...

Пк при запуске игр или программ для работы перезагружается
Коротко о проблеме: При запуске Игры (DOTA2) открывается меню, но при запуске самой карты пк уходит в перезагрузку, иногда даже меню не...

4
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
15.09.2019, 21:31
Цитата Сообщение от Кот1223432234 Посмотреть сообщение
прав ли я в своих рассуждениях?
Спрашивать надо у разработчиков майнкрафта
Цитата Сообщение от Кот1223432234 Посмотреть сообщение
Для обработки они используют экземпляры блоков, в которых хранится вся инфа, что делать с этими данными из массива. Например byte[81, 1, 2, 1, 15]
Это то же, что и экземпляры класса, только в виде массива, разницы никакой.
Лично я бы делал блоки структурами.
0
0 / 0 / 0
Регистрация: 27.01.2017
Сообщений: 52
28.05.2020, 15:17  [ТС]
Итак, прошло довольно много времени, и теперь, когда я уже понял, как и что делать, я могу в полной мере объяснить, что мне требовалось. Я говорил про паттерн фабрика. Мне требовалось создавать экземпляры класса, имея лишь его, например, id. Для этого нужно было как бы "копировать" объект. Но это всё можно сделать с помощью абстрактных классов примерно вот такой вот конструкцией:
C#
1
2
3
4
public abstract Block getBlock(Map map, World world, Chunk chunk, int posX, int posY)
{
    return new blockDirt(map, world, chunk, posX, posY);
}
При этом, можно создать класс, что то типо класса для регистрации блоков, в который можно будет добавлять новые блоки, и юзать их метод getBlock(), вызывая их по id или, к примеру, через enum.
Надеюсь мою дополнение кому-то помогло
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
28.05.2020, 15:43
Кот1223432234, я бы не сказал, что код игры рода майнкрафта или террарии - эталон хорошей архитектуры. В Game Dev обычно уходят на разного рода ухищрения в угоду оптимизации, а не легкости поддержки кода:
- Entity component system - это не ООП.
- Композиция лучше наследования. Абстрактные классы и интерфейсы желательно использовать по минимуму или не использовать вовсе.
- Менеджер сущностный (часто самописный), который позволяет доставать сущности, например, по ID. Т.е., скажем, у игрока нет класса Инвентарь, есть только ID этого инвентаря.
- Structure of Arrays лучше Array of Structures.
- Мне не нравится метод getBlock, потому что он выделяет память. Лучше переиспользовать пул уже созданных, но не используемых, объектов. Или же вообще отказаться от объектов. В C# сборщик мусора уничтожает объекты в случайный момент времени и это дорогая операция, время которой критично для активных игр.
- Блоки хранятся в чанках, причем есть отличия между 3D и 2D. Я точно не помню, но в том же майнкрафте чанки, вроде, размером 16х16х256, не суть. Идея в 3D простая: отрисовать один большой меш в чанке в разы быстрее, чем каждый блок отдельно.
0
0 / 0 / 0
Регистрация: 27.01.2017
Сообщений: 52
10.06.2020, 01:46  [ТС]
Не думаю, что идея состоит только в оптимизации, путём отрисовки чанка за один вызов видеокарты. Как минимум, это очень удобно для бесконечно генерирующего мира. Так же чанки удобны для быстрой скорости сохранения блоков(проще сохранить/загрузить весь чанк за раз, чем сохранять/загружать каждый блок, ведь при движении игрока такие загрузки будут невероятно частыми, что сильно нагрузит систему).

Не понимаю, почему использование выделения памяти плохо? Да, возможно на C# это медленнее, но я ведь уже на c++, а тут, как известно, всё делается вручную. Тем более, если у тебя будут какие то специфические данные, которые будут храниться только в определённых блоках, то откуда для них брать место, как не из динамической памяти? Речь идёт именно о специфических данных, таких как предметы в сундуке, день роста дерева, предметы в печке, в наковалне и т.д. Выделение места под них не будет слишком сильно тратить память. А остальные данные можно не хранить в самих блоках, а хранить в статической памяти, то есть использовать static.
Так же можно не выделять постоянно заново память под id блоков, а выделить их один раз. Специфические данные можно хранить в отдельной области памяти, доступ к которой можно будет получить через указатель, место для которого уже будет выделенно вместе с id блока.
И того, выходит, что чанк будет весить (id(short - 2 байта) + pointer(8 байт(Win64))) * 16 * 16 * 256 = 10 * 65 536 = 655 360 байт = 640 Кб = 0,625 Мб. Если будет, как в майнкрафте, 144 чанка, то 0, 625 Мб * 144 = 90 Мб. Стоит учитывать, что это именно 90 Мб однажды выделенной памяти, то есть выделится она только 1 раз при создании карты. И того, каждые 100 чанков, будет выделяться или удаляться максимум 1000 байт памяти, для хранения специфических данных, что почти никак не влияет на производительность системы.

По факту, конструкция return new почти не будет использоваться. Она нужна лишь при создании мира. С мобами такая херь не прокатит, тк у них слишком много специфических данных + их количество не константно.
Стоит учитывать, что такая система очень удобная при реализации системы, по крайней мере мне...

Если я в чём то не прав, то, плиз, напиши. Буду благодарен

P. S. Если тебе вдруг интересно, как у меня там дела с моей терарией, то, скажу, я многое сделал. Я реализовал бесконечную генерацию мира с возможностью его сохранять и считывать. Так же это относится и к мобам. Проект я приостановил весной, из за индивидуального проекта(в школе такой урок есть, типо курсовая), но уже очень скоро я буду заниматься продолжением разработаки Вот пару скринов
Миниатюры
Устройство работы игр с блоками, такими как mincraft или terraria   Устройство работы игр с блоками, такими как mincraft или terraria   Устройство работы игр с блоками, такими как mincraft или terraria  

Устройство работы игр с блоками, такими как mincraft или terraria  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.06.2020, 01:46
Помогаю со студенческими работами здесь

I7-7700 или i5-7600, 6400 (ПК для стрима/игр/видео работы)
Добрый день, Помогите, пожалуйста, определиться со сборкой: 1. Материнская плата MSI B250M PRO-VDH, Socket1151, iB250, 4DDR4,...

AMD Athlon II x2 - этот процессор для игр и для работы с графикой хорош или нет?
Четырехядерный, 2 с чем-то Мгц на ядро вроде выглядит хорошо, но кроме как с Turion'ом, который стоит на моем ноуте с AMDшками не...

Посоветуйте устройство для игр и не только за 10000 рублей
Здравствуйте! Посоветуйте хорошую модель, которая хорошо покажет себя в: 1. Играх. 2. Просмотр фильмов. 3. Музыка. 4. Камера. ...

Как проверить подключено ли какое нибудь устройство к com порту или нет?
Как проверить подключено ли какое нибудь устройство к com порту или нет?

Как получить устройство, к которому приатачено ваше устройство в стеке устройств
Пишу минипорт драйвер для usb аудио устройства. Для создания устройства вызывается функция порт драйвера PcAddAdapterDevice, в ней...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru