⛏️Оптимизируем Minecraft на Unity3D (часть 7)
HTML-код
- Опубликовано: 1 июн 2024
- Сегодня мы на примере клона Minecraft рассмотрим как можно оптимизировать иргу в Unity 3D. В этих видео мы разбираемся с генерацией 3D моделей из кода, шейдерами, оптимизацией, и ещё множеством аспектов разработки игр
Плейлист со всеми сериями: • ⛏️ Minecraft на Unity
Содержание:
0:00 - Введение
1:37 - Специфика нашей игры
2:15 - Как замерять
3:14 - Замеряем первую версию
5:30 - Создаём табличку
6:02 - Оптимизация массива
8:58 - Оптимизация соседних чанков
12:05 - Оптимизация массива треугольников
16:48 - Неполучившаяся оптимизация
18:11 - Mesh bounds
20:54 - Оптимизация нижней грани
22:17 - Оптимизация боковых стенок
27:40 - Заключение
На этом канале регулярно появляются новые видео, которые позволят тебе научиться создавать игры, или подарят новые идеи и вдохновение, если ты уже умеешь. Подписывайся!
Остались какие-то вопросы, пожелания, или идеи для других видео? Смело пиши в комментарии под видео
Поддержать канал:
btc: bc1q5mycq8x9jr7s0r63xx00xt50tjepflyhlzc09q
eth/usdt(erc20): 0xa30F22fb9898fdc8801703723cd77BE7E678ee13
Другие сопосбы: emeraldpowder.github.io/ru/do...
Ооочень прошу продолжи, не бросай, это одна из лучших серий на тему.
Уверен она со временем принесет очень много просмотров.
продолжи!
Пхахаха, и чел вместо того чтобы забросить рубрику, забрасывает канал на два месяца)
@@kk-ji5fo а который раз блин
Чувак на фронте походу
@@alexanderprudko5396 он вернулся!Како фронт?Вдруг он не в России или укроине?
Классный урок. Что самое крутое, так это разбор темы на реальном, пусть и учебном, проекте. Многие выпускают ролики на совсем никаких проектах, с полу пустыми сценами или на больших проектах, но в отрыве от контекста, а здесь и проект и контекст и сопричастность - просто замечательно.
Так грустно, что ролики такие короткие))
Хочется слушать бесконечно!
Спасибо за ролики!
Вот вы смотрите, а у человека время остановилось... Снял получасовой ролик меньше, чем за минуту, получается. Именно так мой работодатель хочет видеть меня в работе.
Очень интересно, с нетерпением ждал как раз темы оптимизации. Спасибо!
Ждем еще видео. Очень интересно наблюдать за развитием игры
Когда новое видео? Уже 2 недели жду)))
очень интересная тема, а ещё более интересно как далеко ты сможешь зайти в этой серии уроков)
да уж, лишь бы не остановился на полпути
Хорошая тема. На Ютубе много видео о разработке собственных игр, но про их оптимизацию, почему-то, все забывают. Автору респект.
Тема с потоками очень интересна) Очень жду!
Супер! Ждём следующий ролик.
Очень интересно будет посмотреть на работу с разными потоками. Особенно в контексте юнити. С нетерпением жду следующую часть)
огромный респект! За общее правило - замерять показатели до\после, и особенно за пример неудавшейся оптимизации
Отличные видео, одни из лучших по теме Unity на русском ютубе
Серии отлично упорядочены и структурированы, очень хороший способ подачи информации
Ждём новые серии)
Это супер интересно, спасибо за эту серию видео!
ты просто гений, достоин уважения
Да, супер интересно, комментарий в поддержку рубрики
Спасибо за то что вы делаете, вы помогаете новичкам и создаете очень качественный контент ! Спасибо вам огромное
Очень интересно делаешь контент, ты наверно единственный русский разработчик, которого я смотрю. Хоть и программирую 3 года, но просто интересно послушать :)
Спасибо за новые видосы!
Пожалуйста не забрасывай эту идею!
Скоро начну делать 😀
я бы ещё прогружал чанки не квадратом, а кругом. А то получается, что когда игрок смотрит не строго параллельно осям, то у него дальность прорисовки больше. Тогда бы количество прогруженных чанков стало бы на ≈ 22% меньше (1 - (pi * r²) / (2r)²), где r - дальность прорисовки
А ещё лучше загружать только те чанки, которые в поле видимости игрока, в теории это должно оптимизировать ещё на 10-20%
А еще лучше прогружать сначала те, что ближе. тогда мир не перестанет генерироваться, когда ты резко повернешь камеру в сторону
@@erofes3833 А ещё лучше не прогружать чанки. Тогда с оптимизацие проблем не будет
Спасибо автору за полезную тематику
Надеюсь дойдешь до полной копии майна, очень интересно смотреть)
Продолжение будет? Мне нужно(
Спасибо! конечно интересно!
Метод RecalculateNormals() для меша можно тоже заменить ручным просчётом на этапе его генерации. А так как мир кубический, нормали могут принимать всего шесть разных значений, по одному на каждую грань)
Говоря о ushort, для мешей год назад или около того появился новый API, более сложный. Там нужно руками указывать типы данных для позиции, нормалей, индексов (здесь этот ushort). Однако с помощью этого там можно настроить в том числе какие проверки движок должен проводить (выходы за границы массива в буферах вершин и индексов), и если самому всё просчитать, эти проверки можно выключить.
Также вместо потоков можно использовать C# Job System и Burst, но, вероятно, для серии туториалов такое не подойдёт, потому что он накладывает множество ограничений (например, вместо обычных массивов необходимо использовать NativeArray).
Ещё есть алгоритм генерации меша Greedy Meshing. Опять же, он сложнее текущего и делает так, что соседние вертексы, которые находятся в одной плоскости, он объединяет в более крупный. Например, если у нас есть большой куб 16х16х16 (идеальный такой вариант) блоков, при стандартном подходе будет использовано ~6к вершин (или ~1.7к, если делить общие вершины для соседних блоков и не дублировать их). А этот Greedy Meshing эти большие плоские стороны объединит в один большой квадрат, и вершин станет 24. Конечно, это идеальный вариант, и время генерации меша, возможно станет больше, но можно в некоторых случаях выиграть в памяти и снизить нагрузку на рендеринг (особенно будет заметно на каких-нибудь равнинах, где малюсенькие блоки соединяются в +- плоский ландшафт)
Прямо коммент-спойлер, новый API это следующая серия будет, потом ещё многопоточность и greedy meshing тоже уже сделал, надеюсь домонтирую в видео
Если пойти еще дальше и затронуть освещение - самый тяжелый для чанков алгоритм
То в худшем случае, всё превращается в бесконтрольную игру "жизнь"
@@EmeraldPowder а ігра на андройид
@@user-dy1zv3nb3b Нет
Забавно, только зашел посмотреть выпустил ли ты ролик, а ты его выпустил пару секунд назад.
Большое спасибо !
Ждал видео
Когда следующая часть? Очень интересует альтернативный способ визуализации поставленного блока. Я по твоему гайду делаю, но на Godot
Привет! Давно смотрю твой канал и есть одна просьба: в этих ваших интернетах очень мало статей про взаимодействие с мешами (удаление/создание вершин/треугольников). Очень хотелось бы об этом видео.
Ааа! Я просто не могу!
Сейчас 2 часа ночи, и я закончил пересматривать ваши старые видео
Вы такой молодец! Невероятно интересная подача, а главное полезные видео!
Спасибо вам огромное что делаете такой контент
В Minecraft "физические" чанки в генераторе как и тут (16х16х256), а вот "рендер" чанки разбиваются на кубики 16х16х16.
Это даёт хороший прирост во время frustrum culling. Оно и логично: зачем рисовать весь огромный чанк до неба, если мы видим только пару блоков из него.
Интересно было бы послушать про сохранение мира (и динамическую выгрузку в сохранение уже далёких чанков) и динамическую погрузку из сохранения ранее сгенерированных чанков
В Unity встроен JSON для сохранения и загрузки.
из-за разделения текстуры у земли теперь не всегда появляется "челка" травы. на 27:54 видно, на вертикальных поверхностях трава только каждые 4 блока
Так и до этого было, он текстуру не по блокам ставит а по координатам, следовательно при более мелких блоках текстура разделается на несколько блоков. Выглядит уродско, согласен
@@DoGGy1110 выглядит то неплохо, просто для вертикальных нужно поставить чтобы каждый раз бралась верхняя часть текстуры, а так идея хорошая
Похоже на простое сжатие видео
Привет)
Отличное видео)
Хотел бы узнать, будет про сохранение карты, построек и тд?)
В Unity встроен JSON для сохранения и загрузки.
@@Bushido_Cat что он есть я знаю, как его правильно использовать))
я бы за такое деняк заплатил, но п-психология, зачем платить если в свободном доступе, а вот контент только для донатеров - звучит очень вкусно
Occulusion Culling ставить будешь?
Куда делся автор? 🤔
Автор видео перестал страдать херней и устроился на работу.
Моболизовали😢😢
Здравствуй, герой, есть просьба. можешь записать видос по оптимизации с помощью мультитрединга? очень интересная и полезная, в больших проектах, вещь
@EmeraldPowder относительно оптимизации с int/ushort, такая оптимизация бессмыслена, так как CPU (ну вот так сложилось - подробнее в вики, еще можно посмотреть почему NTFS работает также с 4 байтами), работает с 32 битными значениями. Т.е. считывание и запись, происходит блоками по 32 бита. Для чтения ushort (2 byte), цпу считывает 4 байта и по маске отделяет 2 лишних.
Где, оптимизация относительно меньших типов данных работает хорошо. В первую очередь это структуры, там можно указать, что размер структуры задается программистом и соответственно, очень удобно подбивать размер структуры к размеру кратному 4 байтам. По этой причине, в некоторых протоколах, используются типы значения гораздо большие чем требуется.
Ну и как пример, можно оптимизацию производить, на основ MSIL/IL кода и юзая, что-то получше чем базовый профилировщик, к примеру, что-то по типу jetbrains .NET Memory & .NET Trace.
Странно что никто больше это не писал, сам был в поиске этого коммента. Смысл использовать меньшие типы данных есть только в отправке по интернету и в структурах, а в остальном не надо заморачиваться тупо из-за того что всё оптимизировано под инт/флоат и выдумывать бессмысленно
новое видео когда?
Этот канал успел за короткое время стать самым лучшим по юнити и внезапно перестал пополняться контентом... 😢 Вообще печалька. Надеялся выпросить серию видосов по ECS, потому что нормального материала по этой теме вообще нет... Сейчас уже доступна версия 1.0.10 и по ней ничего нет кроме калечной официальной документации..
Лучший
Преобразование типов в c# довольно ресурсоёмко, поэтому неудивительно, что (ushort) привело к снижению быстродействия
P.S. По идее лайков под видео будет больше, если в конце видео выдерживать небольшую паузу перед его завершением, оставив в кадре некую заставку с напоминанием о лайках, колокольцах и подписке. Секунд в 10, так у зрителя будет больше времени на то, чтобы поставить лайк, перед тем, как запустится следующий ролик, при включенном автовоспроизведении. Ведь, когда уже запустился следующий ролик, нужно свернуть окно воспроизведения и нажать "назад" в браузере, чтобы иметь возможность поставить лайк под только что просмотренным роликом, а делать это бывает неудобно или просто лень)
А ещё можно было бы int в некоторых for’ах заменить на какой-нибудь unsigned, где начинается с 0
@@eennou для переменных цикла? Это как раз снизит, хоть и несущественно, быстродействие, т.к. если переменные цикла участвуют в вычислениях внутри цикла, то их значения будут неявно преобразовываться в int или float. А преобразование типов не есть хорошо для производительности. Аааа, дошло это был сарказм! )))
Это был сарказм?
@@valuee5298 да)))
Твои туториалы прекрасны, но не мог ли ты оставлять исходный код под каждым новым туториалом? Я в каком то месте допустил ошибку, и теперь у меня больштие проблемы с генерацией. А пересматривать всё видео и сравнивать по символу как то не сильно хочется👉👈
Еще один супер читерный вариант оптимизации, который применим конкретно к текущей реализации - это генерировать только поверхность на уровне шума перлина, таким образом можно ускорить работу алгоритма генерации в "height" раз
Это бы все ускорило, но у нас же уже можно копать блоки, так что игрок может выкопать пещеру, и тогда таким вариантом меш уже не сгенерируешь. Ну и возможно однажды пещеры даже будут генерироваться, но это не точно)
@@EmeraldPowder Есть ещё один интересный момент - если генерировать таким образом только нетронутые игроком чанки, то они генерируются очень быстро, а как только игрок ломает блок у этого чанка - то начинаем рендерить именно этот чанк "по честному"
добрый вечер , есть предложение по моделированию , как связаться с вами изложить идею ?
А можешь показать, как grid meshing делать? Типа чтобы одинаковые блоки, стоящие рядом "сливались" и тратили меньше полигонов
Оно в первой части было
@@eennou разве? Я пересмотрю, не помню просто
@@eennou greedy meshing это когда несколько полигонов в одной плоскости сливаются в один, чтобы меньше треугольников рисовать. этого ещё не было в серии.
@@Kitulous а, всё, понял про что вы. Да, действительно интересная тема
Сделай физика блока как песок или гравий из оригинала
Будешь переписывать под Entities?
Будет ли видос как сделать Geometry Dash? Желательно в 2D
Кто хочет, просто лайк, и все)
Куда ты делся?) В майнкрафт на юнити ушел играть? Очень жду еще полезных видео!)
Добрый вечер. Я решил создать игру, похожую на террарию и основанную на тайл мапах. Я столкнулся с проблемой реализации освещения (хотя бы, как в мобильной террарии 1.2). Тайл мап либо весь светлый, либо весь тëмный. Есть ли возможность реализовать освещение в тайл мапах, или нет?
Можно, у ного даже видос есть про 2D освещение
Я надеюсь Mojang посмотрят этот ролик, им это сейчас ооочень нужно...
👍👍👍
Что что, а про многопоточность я с удовольствием послушаю. Надеюсь это не будет из разряда, что на каждый чанк создаём отдельный поток. Я так однажды добился того, что все потоки закончились, так как я их не подчищал и Unity просто зависла. А винда выдала ошибку, что больше не может выделить потоков. Я надеюсь эта тема будет хорошо освещена)
Многопоточность можно на генерацию чанка сделать, так 4-8 чанков делать одновременно, а когда будет уже сгенерировано, тогда поток заканчивается, и начинает делать новый чанк если он создаётся
А когда ничего не генерируется то потоки идут на рендер, или другую долгую операцию
Ты топ
Поэтому нужно делать бечмарк из игры- прохождение фиксированного расстояния программно
а игра будет выпущена или нет?
В дальнейшем, было бы неплохо посмотреть какая бы была производительность при включенной gpu instance у материалов, чтобы вызывать отрисовку материала один раз
Если я правильно помню, gpu instancing используется когда один и тот же меш несколько раз рисуется, а тут меши разные, так что не получится его использовать
Привет, стоит ли в 2023 годы врываться в геймдев? Как кодер. Актуально ли это и не потеряет ли актуальность? Возможно ли в перспективе иметь хороший доход в этом? Больше 3000$ например
ломка по новым видео
good one
где же новые видео? 😥
комментарий для продвижения канала
Я предлагаю держать все блоки и описание к ним в json файле(лах) это упростит добавление разных блоков
Эээ.. Нет.. Давай, продолжай выпускать видео. Не бросай всё на полпути. Сарафанное радио уже шикарно работает
Я хочу продолжения! Но оно меня, похоже, не хочет..
Где видео? Мы ждём!
Если переписать на C++, во сколько раз вырастет производительность?
Автор молодец!
Ещё лучше бы было, если под видео размещался итоговый набор скриптов по нему (ссылка на ГИТ в соответствующем состоянии проекта, коммит) для сверки.
а то так и не нашёл отчего спамятся ошибки генерации меша (Например, Failed setting triangles. Some indices are referencing out of bounds vertices. IndexCount: 98304, VertexCount: 8564
UnityEngine.Mesh:set_triangles (int[])).
вроде и размерность чанков такая как у Автора, и "волшебное число 65536)...
С твоими настроками меша может быть максимум 65536 вершин, так как ты, как и автор, используете 2 байтный индекс.
@@OleksiiDemanov не совсем понятно, как исправить - если сменить на long - то его не примет chunkMesh.SetTriangles (можно использовать int или ushort - а он ещё меньше). размер чанка меньше делать?... такое се6е
@@user-qq1xb6ic3l нужно изменить тип индекса на 4 байтный. chunkMesh.indexFormat = IndexFormat.UInt32
Оптимизацию того что в ролике надо было начинать в первую с отказа от устаревшего api для работы с мешем. Переход на jobs + burst. И уменьшение garbage до 0. А то, что показано в ролике конечно интересно для новичков, но это тупиковые действия пока не сделано, что я написал выше.
Возможно кому поможет. 1 создается биом и там уже идет провекра какие мобы и сущьности могут размеаться. Так же для каждого биома своя проверка какие декорации там размещаются.
эмеральд, идеи для след. видео:
1. Моды (C#, Python, Java, JS, Lua, в общем, просто АПИ для модов сделать)
2. Временнóе Изменение стейтов блоков (например у дёрна есть 2 вида, без травы и с травой, пусть земля под землёй с травой будет без травы)
3. Инструменты (к дополнению к 2 пункту, лопатой можно будет выкапывать ПКМом подзол, а мотыгой грядку)
4. Биомы и миры (снежный, саванна, пустыня и т.п., а также обычный мир, ад, энд)
5. Персонаж и его скины
Чувак... каждая из этих тем размером с ЦИКЛ... отдельный...
@@Priboy313 Я не говорю что всё это нужно сделать за одно видео. Смысл был таков: Идеи для следующих видео
Ну, другие измерения, очевидно, будут просто отдельными сценами, а скины как в майнкрафте это на самом деле дико костыльная фигня, и лучше уж делать какой нибудь редактор персонажа, чтобы все возможные варианты внешности уже были встроены в игру, а не вот эти вот свистопляски с загрузкой картинки для каждого игрока который зашёл на сервер
Ты просто перечислил то, что есть в майнкрафте. С таким же успехом можно "посоветовать" ему добавить: крафт, деревья, мобы и т. д.
@@MrVoronaExtra тогда в чём смысл делать МАЙНКРАФТ в юнити, если не добавлять туда, то что есть в оригинальном?
Добрый день! Очень прошу вас о помощи, долго ищу и не могу найти информацию. У меня есть кубик созданный в блендере и налодаными текстурами. По задумке из таких кубов создаются локации в игре. Теребуется удалить грани, которые соприкасаются с другими кубами.
Как по мне проще процедурно меш создавать, и для юнити написать расширение редактора для создания уровня
Го продолжение
Это перезалив? У меня почему-то ощущуение, что я уже смотрел это видео, ну либо у меня очень странное дежавю
ничосе.. ещё и на pycharm! малоч 👍
где ты тут сишарп увидел, додик?))
для чистоты надо брать минимальные значения, потому что ни один процесс или приложение, работающее в фоне не может ускорить профилируемое приложение
3 месяца без видосов :(
Удивительно, что смена размерности массива дала такое сильное снижение времени. Мне это обычно это дает кучу готовной боли и изменения на уровне погрешности.
А мультиплеер будет?
Замена метода на SetTriangles(), скорее всего, на самом деле дала куда больший буст, чем виден в Экселе, потому, что убрала кучу мусора от .ToArray(). Я только не понимаю зачем ты не заменил все остальные методы и не сказал ничего про Garbage Collection в целом.
Когда будет оптимизационный переход на UE?)
Такого пока не планируется)
Продолжение?
А следующая часть так и не вышла :(
А в какой серии будут пещеры и руды?
Это создается в настройках шума путем создания функции трех мерного фрактального бруновского движения путем заменяя блоки воздухом. Тоесть из двух мерного шума перлина создаем трех мерный бруновский.
Сделай еще одно видео где ты создашь генерацию структур, по типу деревни
А это было бы кстати. Так как видео роликов про создания майкрафты куча а в итоге даже нет генерации биомов и размещения мобов и сущьностей.
Где же ты, бро?(
когда видео?
А юнитевский Шарп не знает про статический конструктор (13:50) ?
при первом обращении к класу - вызывается безусловно он. может, я фекалекодер и его использую ))
про битовые сдвиги (int b = (int)a / 4 - то же самое что и int b = (int)a >> 2) - так оптимизатор в Визуал Студии (про Юнити не знаю) делает при Релиз-компиляции, конечно, как и константу 65536*6/4 предствляет в сразу вычесленном виде (но для красоты лучше на калькуляторе посчитать и законстачить). Битовая арифметика выполняется в памяти, гораздо быстрее, чем через "такты процессора", константы, которые лишний раз не высчитываются - рабочий вариант, но не проверял, отработает ли "const" быстрее. Я неуды на лабах за такие пропуски оптимизации получал )
про юшорты - базовый тип у шарпа для вычислений - инт32 (уинт32), в него и так переводит, это не плюсы ) Так что - погрешность вычислений, Но при высвобождении памяти под большооооой массив Инт16 - быстрее работает, так как памяти в два раза меньше таскает влево-право при инициализации массива
Еще из хитростей - ++i работает быстрее чем i++ у Си и Си++. У шарпа такой тенденции не встречал (либо визуалка меня поправляла) )
Битовые сдвиги шарп сам умеет оптимизировать
Про юшорты - разницы с обычными интами нет. У всех команд латенси = 1. Там скорее всего какие-то специфичные микроптимизации для гпу при рендеринге на юшортах. Ну и памяти они меньше отъедают, в отличие от интов
Компилятор не настолько тупой, чтобы не заметить, что результат i++ не используется, и оптимизирует это. ++i имеет смысл для составных типов в C++, для интов разницы нет. В шарпе я уверен - то же самое
Ну блин
Последний видос был месяц назад 😒
чел вернись ми тебе любемо
А игра на телефоне будет?
Надеюсь отсутствие к еще более классному ролику продолжению
Не сферическое в вакууме, а кубическое в вакууме)
а ты не хочешь персонажа там поменьше сделать а то он слишком большой
Ждём уроки unity ) Genshin Impact
Когда видео?