Динамическая оптимизация в UNITY! GPU instancing

  Переглядів 18,481

Яковлев Илья - IT и игры

Яковлев Илья - IT и игры

День тому

📝Всем шарп! Сегодня расскажу вам о динамической оптимизации в Unity. С такой проблемой я столкнулся при создании своей игры с генерацией лабиринта. Необходимо было разом на экране отображать огромное количество объектов и при этом сохранить отличную производительность на телефонах. Также стоит заметить, что ни один из способов статической оптимизации не подходил в этом случае, так как все объекты генерировались прямо во время игры. В итоге я решил эту задачу и теперь хочу поделиться этой информацией с вами)
⚡️⚡️⚡️ Полезные ссылки ⚡️⚡️⚡️
🔎 • Делаю игру с генерацие... - ссылка на первую часть девлога по моей игре
🔎 / @alexgameryt6256 - ссылка на канал моего младшего брата (подпишись если не сложно)
🕒Тайм-коды:
➜ 00:00 - Вступление
➜ 00:45 - Проводим первые тесты
➜ 01:52 - GPU instancing
➜ 02:57 - Скрипт для включения GPU instancing
➜ 04:08 - Проблема с шейдерами
➜ 05:00 - Первый тест с шейдерами
➜ 05:30 - Второй тест с шейдерами. Material prooperty block
➜ 06:10 - Редактирование шейдера и решение проблемы!
➜ 07:20 - Заключение:)
🔥🔥🔥 На этом канале вы найдете множество уроков по Unity и C#, а так же различных видео на тему разработки игр, так что не стесняйтесь, заглядывайте на канал и вы обязательно найдете что-то по душе!🔥🔥🔥
#Unity#ЯковлевИлья#optimization#Оптимизация

КОМЕНТАРІ: 87
@-it394
@-it394 11 місяців тому
Сделал телеграмм канал, залетайте) t.me/yakovlev_gamedev
@Shineglow
@Shineglow 11 місяців тому
Видео по шейдерам очень нужны. Хорошего материала крайне мало. Было бы здорово увидеть не только шейдерграф но и более традиционные шейдеры.
@Natharcheck
@Natharcheck 11 місяців тому
Думал увидеть типичный урок про оптимизацию, но очень сильно ошибся. Лучшая инфа за последний год про оптимизацию!
@user-go7qv2yc6z
@user-go7qv2yc6z 11 місяців тому
Интересные темы разбираются, которые мало освещены в интернете. 👍 Важный момент для начинаюших - если проект под WebGL или мобилки, данный подход надо обязательно тестировать отдельно от других методов оптимизации. И использовать бюджетные модели телефонов, т. к. можно получить обратный эффект в итоговом фпс.
@DELETEpoiuy
@DELETEpoiuy 14 днів тому
Я вообще могу ошибатся но под веб если юзается юнити подходит только SRP? Разве нет? И там совсем другие методы\шейдеры.
@user-go7qv2yc6z
@user-go7qv2yc6z 14 днів тому
@@DELETEpoiuy SRP под веб стоит использовать только опытным специалистам. Так как веб должен предсказуемо работать на большинстве платформ, чаще имеет смысл использовать Built-in. И шейдеры, которые стабильно работают в webGl1.
@Slava.Hizhnyak
@Slava.Hizhnyak 9 місяців тому
да, интересно было бы узнать о шейдере, очень хороший ролик
@hemmikotlin2589
@hemmikotlin2589 11 місяців тому
Спасибо большое, очень полезный урок, ждем видосов почаще)
@dereltyer9878
@dereltyer9878 11 місяців тому
Ты даешь нам инфу которую спокойно можно продавать 😭 огромное спасибо тебе! Надеюсь ты не удалишь канал и не пропадешь)
@illia_ryzhii
@illia_ryzhii 11 місяців тому
Братан, хорош, давай, давай, вперёд! Контент в кайф, можно ещё? Вообще красавчик! Можно вот этого вот почаще?
@mistrebrown7642
@mistrebrown7642 2 місяці тому
Крутейшее видео! Спасибо большое, что делитесь такой инфой!
@newbieproable
@newbieproable 11 місяців тому
Нереально благодарен за этот видос. Сильно помогло. Сейчас проверил. Жаль нельзя поставить больше одного лайка 😁
@user-mm7ch3xw4e
@user-mm7ch3xw4e 11 місяців тому
Хороший видос! Плюсую за видео по шейдерам!!!
@user-my1is1ei2j
@user-my1is1ei2j 11 місяців тому
Здравствуйте. До меня дошёл слух, что если открыть документацию то можно узнать о том, что в настройках от URP есть прям отдельная галочка для выключения SRP batching и static batching и ещё галка для включения dynamic batching.
@askaranarbekov3145
@askaranarbekov3145 11 місяців тому
можно подробнее) или ссылку хоть , а то я пытался как он делать но не вышло
@unitydude
@unitydude 8 місяців тому
@@askaranarbekov3145 В Unity 2022 для URP-проекта будет так: Edit - Preferences - Core Render Pipeline - пункт Visibility ставим в All Visible. После идём в настройки качества графики (которые называются например как URP-Balanced, обычно лежат в папке Settings, по-умолчанию 3 уровня качества создаются), там в разделе Rendering снимаем галочку SRP Batcher. У меня после этого заработало как со скриптом.
@user-du5rw1ql7l
@user-du5rw1ql7l 6 місяців тому
очень помог! Всего тебе наилучшего ) @@unitydude
@dihaneeer
@dihaneeer 3 місяці тому
ЭТО ПРОСТО АПУПЕННО! 👍
@gameviewer5693
@gameviewer5693 9 місяців тому
Спасибо за урок. new WaitForSeconds в данном случае стоит кешировать.
@alexhaler3627
@alexhaler3627 Місяць тому
Я в шоке. Лучший видос по GPU Instancing!
@sonicstalkergames9279
@sonicstalkergames9279 10 місяців тому
Очень помог. Спасибо.
@user-fw4zu1kd2z
@user-fw4zu1kd2z 11 місяців тому
О круто ты вернулся я рад
@Yagir
@Yagir 7 місяців тому
GPU Instancing является проблемой для мобильных процессоров. Например, процессоры PowerVR и их драйвера плохо адаптированы под инстансинг. Это значит что на большей части девайсов низкого ценового сегмента, ФПС с инстансингом будет ниже, и колличество крашей больше.
@user-qo9gn3rw6z
@user-qo9gn3rw6z 3 місяці тому
ты меня спас, добрый человек
@belxsi3533
@belxsi3533 10 місяців тому
воу, чел, спасибо!
@OkMiracle
@OkMiracle 3 місяці тому
C 2d Прокатит такое?) Спасибо за видео!
@andriihema7934
@andriihema7934 11 місяців тому
Очень прикольно
@Light_Script-xh9ww
@Light_Script-xh9ww 20 днів тому
3:00 В идеале этот скрипт ещё удалить с объекта после его выполнения Destroy(this);
@Rama-kz2zx
@Rama-kz2zx 11 місяців тому
Я делаю 2д игры но чую 5 точкой мне это понадобиться. Сохраню очень полезный материал.
@AntonBryzghalov
@AntonBryzghalov 8 місяців тому
Привет! А не подскажешь, может знаешь почему бывают такие случаи: шейдер граф генерит шейдер с 13 CBUFER блоками (что тут заменяются на UNITY_INSTANCING_BUFFER_START/END) с нужной переменной и 2 присвоениями (что тут заменяются на UNITY_ACCESS_INSTANCED_PROP). Думал это из-за использования внешнего субграфа в качестве переиспользуемой функции, но если "вписать" этот субграф как часть основного, ничего не меняется. Тупые замены всех блоков и присвоений по здешнему примеру не помогают, GPU instancing не работает.
@PS-vj6jz
@PS-vj6jz 22 години тому
Такая же фикня. Честно сказать у меня завёлся GPU I, но только на тех объектах, на которых я ничего не меняю в плане графики. Есть пачка объектов - 1.5К штук, вот на них приходится всего 6 дроуколов, есть вторая пачка объектов, так же 1.5 штук, и вот на них то GPU I не работает. В итоге на 1.5К объектов второй пачки приходится 1.5К дроуколов. Первую пачку я никак не трогаю, у вторых кеширую материал, чтобы потом поменять цвет эмиссии, но именно у вторых GPU I и не работает. Удаляю из сущности (класса) кеширование материала второго типа объекта, как на них начинает работать GPU I... То есть сейчас я не могу в рантайме поменять цвет, сразу же подключается SRP Batcher. Unity 2022.3.
@AntonBryzghalov
@AntonBryzghalov 21 годину тому
@@PS-vj6jz если ты кешируешь материал через свойство material рендерера, то как только ты к этому свойству обращаешься, этот рендерер создает локальную копию материала, другими словами при 1.5К обращений к свойству у тебя 1.5К копий материала по 1 на каждый рендерер. Если хочешь, чтобы GPU I продолжал работать, то меняй цвет через propertyblock (renderer.setpropertyblock) -- при этом копии материала не создаются.
@AntonBryzghalov
@AntonBryzghalov 21 годину тому
@@PS-vj6jz Но само свойсто цвета в шейдере должно поддерживать инстансинг, иначе не получится.
@17LittleBastard
@17LittleBastard 2 місяці тому
Как заставить 2 идентичные партикл системы пользоваться одной отрисовкой?
@jayrome9946
@jayrome9946 11 місяців тому
очень полезно, спасибо! а если это применить к sprite Renderer? или у спрайтов, спрайт атлас это решает, по сути тоже самое получается?
@-it394
@-it394 11 місяців тому
Вообще атлас по идее должен помочь. Такой подход сомневаюсь, что будет применим (в 2д редко работаю так что могу ошибаться), но проверить в принципе 5 минут)
@jayrome9946
@jayrome9946 11 місяців тому
@@-it394 Понял, спасибо!
@jayrome9946
@jayrome9946 11 місяців тому
вроде тоже самое, ничего не поменялось, пробовал с включённым атласом, осталось так же)
@-it394
@-it394 11 місяців тому
@@jayrome9946 Спасибо за инфу!
@jayrome9946
@jayrome9946 11 місяців тому
@@-it394 Взаимно! оно как бы и помогло)) только у спрайтов сбивается цвет материала при старте, они все становятся абсолютно белыми) (использовал спрайтовый дефолтный материал) при этом колы уменьшаются в два раза, но когда цвет восстанавливаешь, колы вырастают обратно)
@user-ez4dk4mi2o
@user-ez4dk4mi2o 11 місяців тому
видео по шейдерам на базу Пожалуйста 😘
@supromental
@supromental 2 місяці тому
Сделал как на видео но батчей не убавилось совсем.
@DmitryTrump
@DmitryTrump 11 місяців тому
Илья привет. Скажи пожалуйста , ты даешь частные уроки ?
@-it394
@-it394 11 місяців тому
Пока таким не занимаюсь, но возможно в будущем все изменится. Думаю скоро завести телеграм канал, там можно будет общаться и задавать интересующие вопросы)
@vadoze
@vadoze 3 місяці тому
можно код шейдера ,пожалуйста, не могу обычный урп никак переделать..
@Soprotivlenie_Bespolezno
@Soprotivlenie_Bespolezno 9 місяців тому
Хорошее видео, вот только подходит в основном под ПК игры, а Android - это уже другой разговор. Я ссейчас делаю несколько игр и вс они сильно тормозят даже на мощных устройствах и как я заметил, чем меньше батчей, тем меньше фпс, при этом если батчей батчей будет слишком много, то девайс будет сильно греться. И нет какой-то определённой золотой середины, под каждый проект, та даже под каждую сцену это значение своё... При этом такой пробелмы в моей любимой Unity 5.6.7f1 нет, начал её замечать с версий 2018 и выше...
@domenos8967
@domenos8967 5 місяців тому
Очень крутое видео. Но слишком всё галопом. Просьба выпустить видео с более подробным и детальным разбором. Можно только на бусти - если хотите.
@timecode614
@timecode614 11 місяців тому
Было бы круто посмотреть на реализацию всего этого. Будет обучение ?
@-it394
@-it394 11 місяців тому
Не очень понял, на реализацию чего именно?)
@timecode614
@timecode614 9 місяців тому
@@-it394 на реализацию данной игры)
@koganboss4874
@koganboss4874 10 місяців тому
Интересное решение. А на URP все тоже самое или там GPU inst работает по другому?
@-it394
@-it394 10 місяців тому
Это как раз на urp все сделано
@koganboss4874
@koganboss4874 10 місяців тому
@@-it394 Ааа, я понял... Меня запутал SRP батчер, я подумал речь о scriptable render pipeline... =) Бывает.
@dmitriytuchashvili8594
@dmitriytuchashvili8594 10 місяців тому
@@koganboss4874 SRP это как раз обобщающий термин для URP и HDRP. Сейчас все, что не built-in, то SRP
@koganboss4874
@koganboss4874 10 місяців тому
@@dmitriytuchashvili8594 ааа... Я всегда думал что SRP это какой-то отдельный пайплайн для продвинутых и даже не потрудился об этом почитать.
@Nehorn
@Nehorn 10 місяців тому
Чёрная магия, колдун шарпучий!
@-it394
@-it394 10 місяців тому
😂😂😂
@minority1557
@minority1557 11 місяців тому
Хотим уроков по шейдерам и шейдар графу (для новичков) в интернете очень мало информации, будет очень круто=)
@_mirai
@_mirai 11 місяців тому
+
@theendofinfinity
@theendofinfinity 11 місяців тому
А код подойдет только для 3D, или в 2D тоже можно использовать?
@-it394
@-it394 11 місяців тому
Мы тут в комментариях уже обсуждали этот вопрос) Лучше использовать атласы в 2д
@theendofinfinity
@theendofinfinity 11 місяців тому
@@-it394 ок, спасибо)
@philippb8894
@philippb8894 11 місяців тому
Мне кажется автор до конца не понимает что говорит. Чтобы создать экземпляр статической геометрии в рантайме... Нужно создать экземпляр префаба, помеченный статик флагом и он будет участвовать в статическом пакетировании. Даже процедурно генерируемую сетку можно сделать статической. Но она будет не подвижной, как и вся статическая геометрия. Для этого нужно было написать вершинный шейдер и перемещать вершины в нем, на видео анимация простая, вверх-вниз. Всего-то. В целом видео действительно бесполезно, просто пересказ документации движка, особенно с учетом того, что в shader graph создавать шейдеры проще, не задумываясь о том, какие строчки исправить, чтобы конкретные свойства были доступны при gpu instancing.
@-it394
@-it394 11 місяців тому
Никто конечно не мешает создать экземпляр статической геометрии в райнтаме, но мне не нужна была статическая геометрия. На некоторых кадрах видно, что анимации происходят далеко не только вверх вниз (например в переходе между лабиринтами). Ну и писать под это все шейдеры конечно можно, но я думаю что-то похожее было бы написать сложнее чем воспользоваться способом в видео. Да и тем более не уверен что при динамическом создании статик будет учитываться, но за это не ручаюсь щас
@philippb8894
@philippb8894 11 місяців тому
Ну, убедится в этом можно просто создав из префаба кубик статический, при этом в сцене на нем будет надпись static и при попытке перемещения он двигаться не будет. Юнити 2023.1. Но даже статическая обработка может перегруппировать объекты из-за различных ключевых слов, допустим свечение или металик и спекулар, хотя шейдер один и тот же. Также можно было попробовать использовать динамическую группировку, так как сцена довольна простая (когда объектов мало), но при этом сами сетки разных видов, хотя dynamic batching скрыта из интерфейса движка, наверное не очень эффективна.
@PS-vj6jz
@PS-vj6jz 22 години тому
Странная ситуэшн... Продублирую комментарий: Честно сказать у меня завёлся GPU I, но только на тех объектах, на которых я ничего не меняю в плане графики. Есть пачка объектов - 1.5К штук, вот на них приходится всего 6 дроуколов, есть вторая пачка объектов, так же 1.5 штук, и вот на них то GPU I не работает. В итоге на 1.5К объектов второй пачки приходится 1.5К дроуколов. Первую пачку я никак не трогаю, у вторых кеширую материал, чтобы потом поменять цвет эмиссии, но именно у вторых GPU I и не работает. Удаляю из сущности (класса) кеширование материала второго типа объекта, как на них начинает работать GPU I... То есть сейчас я не могу в рантайме поменять цвет, сразу же подключается SRP Batcher. Unity 2022.3. Ps. Заработал... Делайте всё согласно документации MaterialPropertyBlock. Я так и делал, получал мешрендерер объекта и в него передавал MPB, но забыл, что в Awake кешировал материал этого объекта, кешировал его для тестов, но именно это кеширование и не давало GPU I использовать этот объект. Создавался экземпляр данного материала , а этого делать не нужно. Просто берите мешрендерер и передавайте в него объект MaterialPropertyBlock.
@scoutrava
@scoutrava 10 місяців тому
Эм, а почему в unity этого вообще по умолчанию нету? В UE есть. Как без этого вообще игры можно делать...
@DaS_10
@DaS_10 6 місяців тому
Есть мечта сделать огромную глобальную стратегию в реальном времени, но вот как раз боюсь за оптимизацию, да и навыка точно не хватит
@test14078
@test14078 10 місяців тому
Да, Batches уменьшилось, но вместо увеличения FPS он просел в 2 раза вот видео с результатом - ukposts.info/have/v-deo/sWCXk4afj5hzl2Q.html Note that this is not compatible with SRP Batcher. Using this in the Universal Render Pipeline (URP), High Definition Render Pipeline (HDRP) or a custom render pipeline based on the Scriptable Render Pipeline (SRP) will likely result in a drop in performance. Есть ли альтернатива для HDRP?
@yaskadef
@yaskadef 7 місяців тому
Использую URP, количество батчей уменьшается, но fps не вырастает, даже проседает немного, кто-то нашел решение?
@test14078
@test14078 7 місяців тому
​@@yaskadef Решения не существует - Note that this is not compatible with SRP Batcher. Using this in the Universal Render Pipeline (URP), High Definition Render Pipeline (HDRP) or a custom render pipeline based on the Scriptable Render Pipeline (SRP) will likely result in a drop in performance. ukposts.info/have/v-deo/sWCXk4afj5hzl2Q.html
@krivodeling7925
@krivodeling7925 10 місяців тому
+
@fortnitebestmoments368
@fortnitebestmoments368 10 місяців тому
Какой гений додумался создать напоминание о взаимодействии 6:05 - 6:37 в sponsor block?
@bobrokrol
@bobrokrol 11 місяців тому
выглядит как хак, который может перестать работать при любом обновлении движка.
@-it394
@-it394 11 місяців тому
В случае юнити так можно сказать про что угодно😂
@bobrokrol
@bobrokrol 11 місяців тому
@@-it394 ну меня это удивляет, этой юнити уже лет 15, и не работают стандартные вещи как оптимизация draw call. Какой смысл в стандартных инструменьах если при добавлении 100 кубиков у тебя 10 фпс.
@chillcompany1028
@chillcompany1028 11 місяців тому
​@@bobrokrol ну не 100, а вот если +- тысяч 10-100 то да :)
@-it394
@-it394 11 місяців тому
@@bobrokrol На самом деле да, много есть вещей, которые казалось бы должны работать уже по умолчанию, но нет)) Всегда надо изобретать велосипед
@SaironW
@SaironW 11 місяців тому
Для себя я решил бы эту проблему следующим образом: для такой игры, выкинул бы нафиг юнити. Там рисовать надо однообразные тайлы. Сделал бы класс рендерера для всей поднаготной. Подключил бы либу DX или Ogl и в общем-то всё. А то "Создадим нашу игру в юнити, а теперь начинаем бороться с производительностью, выключением лишнего, оптимизацией оставшегося, допиливанием шейдерами недобитков, вкручиванием скриптов для того что недобили". Зачем такой геморрой? Надо рисовать 6 тайлов и персонажа - изучите как работает видяха и библиотеки для работы с ней. Чтобы получить банан - не надо тащить всю банановую рощу со всеми пальмами, со всеми работниками на ней работающими, всех обезьян и всех питонов которые там обитают. Учите технологию. А то трипл-А игры выходят по 20 ФПС на топовых видяхах именно потому что: "А ЧО а юнити есть, давай туда модель игрока в 70к полигонов кинем, она же должна тянуть"
@tryasunshatun
@tryasunshatun 11 місяців тому
А теперь смертельный номер на арене нашего цирка - юзер собирает билды под все платформы!
@janitor13
@janitor13 9 місяців тому
Согласен нахуй эти движки, предлагаю ещё и от IDE отказаться да и ваще от готовых систем пк и ноутов, а то создадим код на пк, а теперь начинаем бороться со скачиванием пакетов, настройко ide, установкой программ, лучше сразу заебашить под себя пк, написать свою ОС систему, свою ide, свой движок и сделать свою классную игру.
@AndreyDzhevzhik
@AndreyDzhevzhik 6 місяців тому
иди проспись идиот
@vg-vovagatova289
@vg-vovagatova289 9 місяців тому
У меня очень сильно грузит процесс: semaphore.waitforsignal У меня игра для пк, как мне исправить это? Потому что-то больше 30%+
Shader graph в Unity! Проще чем кажется! Шейдер граф
12:48
Яковлев Илья - IT и игры
Переглядів 22 тис.
Оптимизация игр на unity. Material instancing
8:19
Максим Крюков
Переглядів 17 тис.
КИРПИЧ ОБ ГОЛОВУ #shorts
00:24
Паша Осадчий
Переглядів 4 млн
Анита просто на химии, поэтому такая сильная
00:21
Женя Лизогуб SHORTS
Переглядів 2,5 млн
РАЗБОР собеседования на 4000$ - Unity Developer | Вопросы Hard и Soft, тестовое, livecoding
25:34
Мирошкин Олег | Состоятельный геймдев
Переглядів 3,1 тис.
Вернулась ЛЕГЕНДА | Brackeys, Unity, Godot, Геймдев?
8:14
Grisha - Игры делаю
Переглядів 1,6 тис.
Как ОПТИМИЗИРУЮТ ИГРЫ
11:00
Atix
Переглядів 294 тис.
Я сделал Гугл Динозаврика ОНЛАЙН НА ДВОИХ :3
14:45
Хауди Хо™ - Просто о мире IT!
Переглядів 50 тис.
Оптимизация игры на Unity. LOD Group
7:26
Night Train Code
Переглядів 13 тис.
КИРПИЧ ОБ ГОЛОВУ #shorts
00:24
Паша Осадчий
Переглядів 4 млн