Оптимизация игры в Unity. Повышаем FPS

Поділитися
Вставка
  • Опубліковано 16 жов 2024
  • Салют, ты на канале Night Train Code :)
    Как заменить 10000 void Update на один?! 1 Update на всю игру в Unity3D!
    Как оптимизировать игру в Unity
    Как создать игру с нуля самому на Unity
    В этом ролике затронута тема увеличения производительности в игре на движке Unity путём оптимизации метода Update с помощью кэширования
    • 🖤 Материалы из видео:
    github.com/Mee... (в версии 2.0 методы называются немного иначе, см. документацию. Старая версия есть в релизах)
    • 🖤 MonoCache релизы:
    github.com/Mee...
    • 🖤 GitHub: github.com/Mee...
    • 🖤 VK: nighttr...
    • 🖤 Telegram: t.me/nighttrai...
    • 🖤 Instagram: / the.meps_
    • Основной Instagram аккаунт с другим интересным творчеством: / crazychillers
    Можешь подписаться на канал, чтобы не пропустить новые ролики по оптимизации игр и их разработке 🤙
    Идея оптимизации взята с канала "Pixeye"
    / pixeye
    Поддержка канала:
    www.donational...

КОМЕНТАРІ • 97

  • @NightTrainCode
    @NightTrainCode  3 роки тому +7

    🔥 MonoCache 2.0 уже лежит на GitHub, он немного отличается от версии из видео, но в релизах есть и старая. Рекомендую сразу использовать версию 2.0 и прочитать короткую и понятную документацию)
    github.com/MeeXaSiK/MonoCache

    • @lewaplay
      @lewaplay 2 роки тому

      Ты в своём MonoCache 2.0 за каким то хером прямо в GlobalUpdate логику покраски текста консоли хранишь и в Singleton у тебя where TSingleton : MonoBehaviour хотя ты форсишь MonoCache... это какой то рофл? Может это надо пофиксить?

    • @NightTrainCode
      @NightTrainCode  2 роки тому +2

      @@lewaplay Покраску текста можно вынести в другой класс, не спорю)
      А насчёт синглтона
      var instance = Singleton.Instance для лохов?)
      И неважно от чего наследуешься

  • @SCEEF
    @SCEEF 3 роки тому +15

    Самое то, перед дембелем, впитать новых знаний, чтобы в июле обновить все старые проекты, дав им оптимизации и новой жизни, а за одно и в новых не делать старых ошибок

  • @-toplib-
    @-toplib- Рік тому +8

    Спасибо, я из 29 ФПС оптимизировал от 41 мин до 76 ФПС +-

  • @Arrrr-gj6kk
    @Arrrr-gj6kk 20 днів тому +1

    По сути, вы изобрели ECS

  • @lkghost7
    @lkghost7 3 роки тому +2

    такой своеобразный пул, я бы конечно изначально не применял такое архитектурное решение ), но подход интересный это да.

  • @Pravda-bw3tj
    @Pravda-bw3tj 3 роки тому +6

    сегодня он Упдейт Менеджер завтра Директор

  • @RumTerry
    @RumTerry 3 роки тому +10

    Стоило бы использовать HashSet вместо List для пула объектов. Во первых - однозначное отсутствие копий, во вторых - вычислительная сложность удаления объекта - O(1), в отличие от листа, который будет перестраивать внутренний массив.

    • @N1kkyS
      @N1kkyS 3 роки тому +2

      Однако итерация по HashSet и Dictionary медленнее чем у списка (не так чтобы сильно, но все же), я тоже так сначала думал что хешсет хорошее решение, но отказался. Плюс есть вопросы к скоростям for(i= ) и foreach. Первые два вроде как не работают через for.
      Буду рад если поправишь!

    • @RumTerry
      @RumTerry 3 роки тому

      @@N1kkyS это возможно только в самом Unity из-за старого mono или оверхеда от IL2CPP. Внутри хэшсета всё равно хранится массив, как и в списке

    • @N1kkyS
      @N1kkyS 3 роки тому

      @@RumTerry а что насчет скорости итераций через фор и форич?

    • @RumTerry
      @RumTerry 3 роки тому

      @@N1kkyS опять же старый mono. В .NET эти моменты давно оптимизированы, надо дождаться пока Unity на него перейдут

    • @francyi-d
      @francyi-d 5 місяців тому

      Ну... Вроде структура данных у HashSet располагает элементы не линейно, друг за другом, как в List, так? Ну и вроде как итерация по такому линейному прямому массиву как в List должна быть быстрее, правильно? Ну там, кеш CPU, все дела. Плюс Span - хорошая вещь для быстрой итерации. С обычным массивом или List должна работать, а вот сможет ли она работать с структурой данных такой как хеш таблица... Очень сомневаюсь.

  • @vladyan01
    @vladyan01 2 роки тому +2

    Как вообще возможно в этом всем разобраться, а еще и придумывать что-то, жесть, люди с другой планеты

    • @NightTrainCode
      @NightTrainCode  2 роки тому +2

      Если чему-то уделять хотя бы полчаса каждый день, то всё возможно, спасибо)

  • @olegggames6409
    @olegggames6409 2 місяці тому

    Гениально

  • @lewaplay
    @lewaplay 2 роки тому +1

    Супер! Спасибо

    • @NightTrainCode
      @NightTrainCode  2 роки тому

      На здоровье. В GitHub лежит MonoCache 2.0. Рекомендую сразу установить его, избавит от потенциальных ошибок) Понятная документация там имеется

  • @cyberkyb461
    @cyberkyb461 2 роки тому +1

    Когда закидываю скрипт Global Update в пустышку выдаёт ошибку "Can't add script component 'Global Update' because the script class cannot be found. Make sure that there are no compile errors and that the file name and class name match. "

    • @INFinitely_Unregistered
      @INFinitely_Unregistered Рік тому

      Проверь совпадают ли названия класса и файла скрипта

    • @MrArtrynk
      @MrArtrynk Рік тому

      Какое название класса, а какое у скрипта?(наверно по дефолту так и осталось).

  • @Андрей-в7и6ь
    @Андрей-в7и6ь 3 роки тому +1

    О, прикольно, я первый) Я б такие ролики смотрел, с кайфом, продолжай!!!

    • @NightTrainCode
      @NightTrainCode  3 роки тому +3

      Спасибо)
      Идеи для видосов есть, в ближайшем будущем:
      - Больше уроков по оптимизации
      - Фишки в C#
      - Обзор моего воксельного лоу-поли шутана про Россию
      - Другие крутые плюшки по Unity (как сделать персонажа, селектор оружия, стрельба, как сделать 3д модель человека по фотографии, анимация и др.) и тонкости

    • @Андрей-в7и6ь
      @Андрей-в7и6ь 3 роки тому +1

      @@NightTrainCode О, крутые темки! Я начинающий, мне это интересно) сейчас вот задумался об оптимизации, так как дофига объектов на карте будет, тысячи тайлов, юниты и тд. По с# тоже интересно, в частности как в идеале делать юниты и здания, наследниками от общего класса, нужны ли там интерфейсы и тд, я пока не особо шарю. Вобщем любому материалу буду рад, твори!))

    • @NightTrainCode
      @NightTrainCode  3 роки тому +1

      @@Андрей-в7и6ь Для твоей игры идеально подойдёт мой видос, если юнитам нужны апдейты
      Ещё в юнити есть Dynamic Batching, включается вроде в "Player Preferences -> Player", после активации нужно на каждом материале включить "Enable GPU instancing"
      Ещё поищи в Ютубе про Occlusion Culling в юнити, про него тоже видос планирую сделать
      Мог бы ещё про свет рассказать, но там слишком долго, поэтому вариант один - ждать мой видос 😹

    • @Андрей-в7и6ь
      @Андрей-в7и6ь 3 роки тому +2

      @@NightTrainCode да, по апдейтам взял на заметку реализую) слышал про эту тему, но ты хорошо объяснил, без лишней воды, спасибо! по occlusion culling у блогера с забавным ником Владимир свет Игродельский узнал)) толково рассказывает, старается подробно и чтоб начинающим понятно было. Я уже попробовал его применять но в сравнении с тупой деактивацией объектов на определённом расстоянии от камеры кулинг вроде бы медленнее, хотя надо будет ещё позже проверить.. Batching ущё не крутил, спасибо за наводку) подписался, с удовольствием посмотрю твои следующие видосы!

    • @NightTrainCode
      @NightTrainCode  3 роки тому

      @@Андрей-в7и6ь Благодарю 🔥
      Да, он тоже хорошо объясняет, один из немногих, на кого я подписан

  • @Comrade_Suli
    @Comrade_Suli 3 роки тому +2

    Них..я не понял, но выглядит интересно

  • @temptemp3346
    @temptemp3346 2 роки тому

    Вопрос, а можно ли использовать листы и встроенный в них ForEach?

  • @grandsunhar
    @grandsunhar 2 роки тому

    Супер

  • @sestareknewgamestar2631
    @sestareknewgamestar2631 3 роки тому +1

    Привет! Это решение точно будет лучше в плане оптимизации,?

    • @NightTrainCode
      @NightTrainCode  3 роки тому +1

      Небольшой прирост фпс будет, если на сцене куча апдейтов
      Здесь и свои нюансы есть, например, если важен порядок выполнения апдейтов, то с этим способом, возможно, будут проблемы)

    • @KadykovDenis
      @KadykovDenis Рік тому

      @@NightTrainCode а если применять не update, а yield return null в разных карутинах? будет ли прирост если объединить в одну?

  • @ДелайДобро-в9ж
    @ДелайДобро-в9ж 3 роки тому +2

    Так, а если у меня 100 апдейтов, а не 1к, то целесообразно ли это все использовать?

    • @NightTrainCode
      @NightTrainCode  3 роки тому +1

      Естественно, даже если у тебя всего лишь два апдейта)
      Такая реализации во многом будет получше :)

    • @ivanm71
      @ivanm71 3 роки тому +12

      @@NightTrainCode чем же она лучше? Накидает кто-то потом на такие монобехи анимаций, короутин. Захочет запаузить объект, перестав вызывать Tick , и все сломается

    • @oleksandrmartysh7534
      @oleksandrmartysh7534 2 роки тому +4

      @@ivanm71 Хорошо сказано! Корень всех зол - миниоптимизации там, где они не нужны. :)

    • @bq_g9369
      @bq_g9369 Рік тому +3

      я не советую делать то что на видео, я тестировал разные нагрузки, не только через профайлер. вышло что юнити справляется с индивидуальными апдейтами на обьектах лучше , чем если прогонять это все через листы или арреи каждый фрейм. может сейчас ситуация другая с юнити дотс, но не с такой реализацией 100%.

    • @Bushido_Cat
      @Bushido_Cat 5 місяців тому

      @@bq_g9369согласен, эта реализация не чуть не повысит производительность, так как сама жрет дополнительную память на обслуживания самой себя с кучей экземпляров которые создаются и уничтожаются.

  • @kormak7817
    @kormak7817 Рік тому

    Можно узнать что за песня в конце видоса?

  • @Kostyan_Sigaev
    @Kostyan_Sigaev Рік тому

    Ну а если у меня автосимулятор?

  • @mactepmac
    @mactepmac 2 роки тому +1

    очень странно. сделал все как на видео. прироста фпс вообще никакого.

    • @_mirai
      @_mirai Рік тому +2

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

  • @QQQ-cy6di
    @QQQ-cy6di 5 місяців тому +1

    как я сюда попал? зачем я это смотрю? ведь я даже не программист 🤔

  • @davityeghoyan9957
    @davityeghoyan9957 3 роки тому +3

    можно сразу ESC

    • @NightTrainCode
      @NightTrainCode  3 роки тому +1

      Ролик про ECS уже есть на канале 😎

  • @alexwinston3635
    @alexwinston3635 3 роки тому +1

    Где ты этому научился?

    • @NightTrainCode
      @NightTrainCode  3 роки тому

      Самоучка + спасибо Пиксаю за конкретно этот способ

  • @red4ss
    @red4ss 3 роки тому

    Где взял модельки для своей игры?

    • @NightTrainCode
      @NightTrainCode  3 роки тому

      В ролике про Light Probes я об этом рассказывал)

    • @NightTrainCode
      @NightTrainCode  3 роки тому

      А персонажа и оружие сам делал

  • @frost2519
    @frost2519 3 роки тому +1

    дарова у меня тут возникла одна проблемка я не могу открыть архив из видео можешь мне скинуть в вк скрипты отдельно?

    • @NightTrainCode
      @NightTrainCode  3 роки тому

      Хола,
      MonoCache: drive.google.com/file/d/1y77YEHZG7OZEzS1l8YwgfqZSO5KRuySg/view?usp=sharing
      GlobalUpdate: drive.google.com/file/d/1h6AXdyGrc7FpUmkchLddTONbAA3PuLtv/view?usp=sharing

    • @frost2519
      @frost2519 3 роки тому

      @@NightTrainCode спасиб большое)

    • @NightTrainCode
      @NightTrainCode  3 роки тому

      @@frost2519 На здоровье)

    • @frost2519
      @frost2519 3 роки тому +2

      @@NightTrainCode я тут на юнити делал шутер но я незнаю как сделать стрельбу из автомата можешь снят тутор как сделать стрельбу просто я поискал на ютубе но все видосы старые и половина скриптов не работают пожалуйсто)

    • @NightTrainCode
      @NightTrainCode  3 роки тому +2

      @@frost2519 Могу организовать)

  • @Anton-ny6tx
    @Anton-ny6tx 3 роки тому +1

    Сп*зжено с канала Пиксая без указания ссылок на первоисточник? Круто! Респект!

    • @NightTrainCode
      @NightTrainCode  3 роки тому +3

      Его видоса и канала в настоящее время я найти не могу, а ценная информация должна быть доступна всем 🔥

    • @grimseal
      @grimseal 3 роки тому +2

      @@NightTrainCode он их скрыл из общего списка видосов, т.к. переориентировал канал на свою игу, но их все еще можно найти если зайти к нему в плейлисты.
      ua-cam.com/users/Pixeyeplaylists

    • @NightTrainCode
      @NightTrainCode  3 роки тому +1

      @@grimseal Опа, нифига ты сыщик) 🔥

  • @samvelnorekyan2397
    @samvelnorekyan2397 2 роки тому

    А можем с Start() тоже так делать?

    • @polandpolandpoland6622
      @polandpolandpoland6622 2 роки тому

      Можно, только зачем? Ты же не будешь среди геймплея дёргать 40 тысяч стартов из-за которых появятся статтеры, а в начале сцены один кадр длиной даже 200 мс никакой погоды не сделает

  • @timurmingulov1535
    @timurmingulov1535 Рік тому

    Сомнительное решение на самом деле. Доп-наследование, а прирост не такой уж и существенный, а функция апдейт используется довольно редко.
    Может стоит поискать какое-то более производительное решение, раз уж прям нужно отрисовать тучу чего-либо? Например, партикли или шейдера.

  • @Tarpopo
    @Tarpopo 3 роки тому

    еее, пиксай, к сожалению уже скрыл кучу уроков у себя на канале

  • @IIIllllllllll
    @IIIllllllllll 3 роки тому

    *ТВОЮ М@ТЬ, ЧТО У ВАС ЗДЕСЬ ПРОИСХОДИТ..А?*

  • @Game_max88
    @Game_max88 Рік тому

    Я не могу повесить скрипт

  • @ИмяФамилия-у9щ2п
    @ИмяФамилия-у9щ2п 2 роки тому +2

    Ну чет честно говоря слабо. Было 29fps стало 36fps. Это даже не в два раза. Я понимаю если было б 30 fps стало 700. Тогда бы да.

    • @NightTrainCode
      @NightTrainCode  2 роки тому +8

      29 и 36 фпс - это уже огромная разница. Особенно если проект коммерческий
      Один прием оптимизации вряд-ли решил проблему, нужно комплексное решение

  • @NezertorcheaT
    @NezertorcheaT Рік тому

    что, как?

  • @Wk3611
    @Wk3611 10 місяців тому

    У меня только 20 фпс отнялось)

  • @sucompanygames
    @sucompanygames 2 роки тому

    error CS0246: The type or namespace name 'MonoCache' could not be found (are you missing a using directive or an assembly reference?)

  • @Star-j6b6e
    @Star-j6b6e 2 роки тому +3

    Бред полнейший, закрытая реализация Update именно так и устроено, одним событием вызывается все. Кешировать Update накера надо? Чтобы использовать позже? Прошлые кадры для отображение куба разве для этого :((( не проще ли сделать спрайт и отображать 1000-раз быстрее.

  • @coolplayerivan
    @coolplayerivan Рік тому

    еще бы накинуть систему джобей и норм

  • @mihanikgames3304
    @mihanikgames3304 3 роки тому

    шо? выигрыш 3мс или 3 фпс? хрень какая то...

    • @NightTrainCode
      @NightTrainCode  3 роки тому

      На канале есть видео про NightCache, обновленная система. Там есть детальное сравнение, где выигрыш по производительности - 25%

    • @Александр-с6з5к
      @Александр-с6з5к 3 місяці тому

      @@NightTrainCode Я похоже слепой, не могу найти видео по NightCache, можете дать ссылку?

  • @Veyron104
    @Veyron104 Рік тому

    мде, нормально же всё было, зачем маты в видосе? У некоторых дети ходят по комнате...

    • @NightTrainCode
      @NightTrainCode  Рік тому +1

      На ютубе к такому нужно быть готовым (и это моё первое видео) и для детей есть отдельный раздел на UA-cam

    • @Veyron104
      @Veyron104 Рік тому

      @@NightTrainCode я понимаю что канал не для детей в плане контента, но они могут быть рядом когда я смотрю видосы, но это первый видос с матом на этом канале) надеюсь на "культурные" ролики в дальнейшем)

    • @NightTrainCode
      @NightTrainCode  Рік тому +2

      @@Veyron104 Это мой первый и единственный ролик с матом)

    • @Veyron104
      @Veyron104 Рік тому +1

      @@NightTrainCode эт называется фиаско) как я так открыл ролик из подписок и попал на единственный ролик с матом на канале)))

    • @NightTrainCode
      @NightTrainCode  Рік тому +3

      @@Veyron104 Пхахах, закон подлости 😹

  • @ivankramarenko
    @ivankramarenko Рік тому

    рекомендую, данный способ оптимизаций, ну оч полезный, если вы с росеи, канешн, норм людям бог дал мозг

    • @EndMan
      @EndMan Рік тому

      Типо русские не имеют мозга? Вы ксенофоб?

    • @ivankramarenko
      @ivankramarenko Рік тому +1

      @@EndMan нуууу.. я люблю людей, но не тех кто причиняют другим вред на прямую или косвенно, а этот контент вреден, как и практика синглтона в большой системе

    • @_mirai
      @_mirai Рік тому

      ​@@ivankramarenkoиспользование одного апдейта удобно хотя бы потому, что можно отключить все апдейты из одного места, тем самым поставив игру на паузу, не трогая тайм скейл. Плюс можно отключать апдейт самому себе, когда он не нужен, а потом снова включать.
      Так что один апдейт это скорее хорошая практика, чем наоборот.
      Кстати, а где ты в этом видео сингелтон увидел?)

  • @chmo123
    @chmo123 4 місяці тому

    И какой смысл? Мне надо из 30 сделать 100
    Нахуя мне 3 фпс? Делать гораздо сложнее
    А смысла почти нет
    А чё делать с Fixed Update? У меня на нем вообще вся игра работает

  • @vg-vovagatova289
    @vg-vovagatova289 Рік тому

    У меня очень сильно грузит процесс: semaphore.waitforsignal
    У меня игра для пк, как мне исправить это? Потому что-то больше 30%+

    • @NightTrainCode
      @NightTrainCode  Рік тому +1

      Это нормально. Насколько помню, это процессор ждёт видеокарту, когда он подготовил кадры (вроде бы когда подготових их больше, чем видеокарта может отрисовать), а она их отрисовывает.