Асинхронное программирование в C# и Unity3D для продвинутых

Поделиться
HTML-код
  • Опубликовано: 16 дек 2024

Комментарии • 132

  • @Gekker42
    @Gekker42 3 года назад +53

    чувствовал себя "продвинутым" первые пять минут, а потом мозг поплыл.
    сложно, но познавательно. То, что понял, информацией было полезной, спасибо за видос

    • @gaitavr1992
      @gaitavr1992  3 года назад +13

      Имеет смысл вернуть потом и еще глянуть после некоторой практической работы

    • @PelipUnityDev
      @PelipUnityDev 2 года назад +5

      @@gaitavr1992 Я так поступал со всеми видео по паттернам. Спасибо за видосы))

  • @alexeygolubev3104
    @alexeygolubev3104 3 года назад +44

    До этого видоса даже не задумывался, что под капотом у async/await. Топчик, спасибо за видос !

    • @mimineko3100
      @mimineko3100 3 года назад

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

  • @toxicknight3079
    @toxicknight3079 3 года назад +53

    Круто, но сложна. Обязательно буду еще несколько раз пересматривать, может однажды все дойдет :)

  • @fumanchez
    @fumanchez 3 года назад +19

    дня 2 читаю про асинки, но это лучшее что я видел - и всего за 20 минут

    • @gaitavr1992
      @gaitavr1992  3 года назад +7

      Я бы рекомендовал на практике использовать хотя-бы пару раз, теория выветривается быстро

  • @ИгорьСлепков-х3с
    @ИгорьСлепков-х3с Год назад +1

    Спасибо.
    И ещё четыре слова.

  • @ve1c0m
    @ve1c0m 3 года назад +7

    Читаю твои комменты, а в голове брутальный голос из видео)))
    Спасибо, очень ценная информация, много чего узнал.

  • @DmitryTimofeev_general
    @DmitryTimofeev_general 3 года назад +8

    Хороший видос. Мощную работу проделал.

  • @aynotation5202
    @aynotation5202 Год назад +1

    Не первый раз смотрю это видео, но если раньше это было просто под попкорн, и я тогда ничего так и не понял, то сейчас возникла именно необходимость в данном материале, и зашло на 10/10. Ни один из вопросов по асинкам не остался без ответа. Благодарю

    • @СветозарБоголюбов
      @СветозарБоголюбов Год назад

      Хз, в справочниках намного больше инфы. Но она вся вряд ли кому-то нужна, даже то, что здесь, не нужно большинству программистов Unity. Но стоит как минимум прочитать, чтобы иметь представление и все это не казалось магией в реальных примерах.

    • @inrage7871
      @inrage7871 7 месяцев назад

      @@СветозарБоголюбов Подскажи такой справочник пожалуйста

  • @БАНДАРТ
    @БАНДАРТ 4 месяца назад

    круто! спасибо за видео. разобрался с асинхронными функциями!

  • @simxan123
    @simxan123 Год назад +2

    Очень круто и очень непонятно, ошибочно думал, что уже начал разбираться в C#.. Вы спустили маня с небес на Землю😀 Однозначно подписка и изучение контента, высший пилотаж!

  • @JustPlayingBroGD
    @JustPlayingBroGD 3 года назад +4

    Ты невероятно полезен!

  • @МихаилКрасаков-ж6ю
    @МихаилКрасаков-ж6ю 3 года назад +2

    Понял где то половину, наверное....) Очень интересно, спасибо!

    • @gaitavr1992
      @gaitavr1992  3 года назад

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

  • @kirillsviderski4739
    @kirillsviderski4739 3 года назад +1

    Самый тематичный посыл подписаться в истории Ютуба)

  • @tech_jp160
    @tech_jp160 2 года назад

    Впервые вижу блогера с такой глубиной знаний, спасибо!

  • @ell_pavel
    @ell_pavel 3 года назад +1

    Хороший контент, буду ждать второй части!

  • @avaloniuss
    @avaloniuss 9 месяцев назад

    Круто рассказал!

  • @sergei-fil
    @sergei-fil 3 года назад +2

    Ничего не понял, но очень интересно)) Шутка) Материал подан очень хорошо! Спасибо большое! Давно хочу разобраться с async/await и думаю это видео мне очень сильно в этом поможет, буду точно его пересматривать ещё несколько раз.

  • @andrey_consoles
    @andrey_consoles 2 года назад

    Спасибо за видео!

  • @orik9242
    @orik9242 3 года назад

    Я от Сакутина. Очень благодарен ему за рекламу и тебе за познавательное видео.

    • @gaitavr1992
      @gaitavr1992  3 года назад

      Я ему тоже благодарен, бустанул мне канал очень хорошо)

  • @АлександрПлотников-х8р

    Видео огонь 🔥 Узнал много нового

  • @kirill7637
    @kirill7637 3 года назад

    Спасибо за отличное видео. Даже опытным разработчикам помогает освежить знания.

  • @inskips
    @inskips 3 года назад

    Очень доходчиво. Спасибо за вашу работу. Каждый раз очень жду нового видео.

  • @MOQred
    @MOQred 3 года назад

    Года 2 назад был бы такой видос, не было бы предела моей радости и задачу закрыл бы в срок xD
    Очень хорошо рассказано

  • @neitron29
    @neitron29 3 года назад

    очень недооцененный ролик - тема и ее разбор очень интересны! именно так и должно изучаться программирование - когда код разработчика осознаный! Спасибо большое - желаю роста каналу! лайк подписка)

  • @user-bn6bs9qk1z
    @user-bn6bs9qk1z 3 года назад

    Круто, жду продолжения !

  • @АркадийШеховцов
    @АркадийШеховцов 3 года назад

    Спасибо, помогло в работе

  • @petrosaslanidis
    @petrosaslanidis 3 года назад

    Спасибо . Как всегда на уровне

  • @easycodeunity3d14
    @easycodeunity3d14 3 года назад

    Кайф. Спасибо!

  • @СамвелСаруханян-ъ7к

    Сама тема классная, да и голос что надо. Чего мне реально не хватает, это дельных примеров (желательно простоватых), где это конкретно стоило бы применить. А так, спасибо, очень познавательно.

    • @gaitavr1992
      @gaitavr1992  3 года назад

      Этот ролик про то, как работает изнутри, естественно он предполагает опыт использования тасок. В интернете куча примеров для новичков есть, в том числе рунете

  • @lkghost7
    @lkghost7 3 года назад

    просто отлично

  • @andrewmad
    @andrewmad 3 года назад

    Круто, Макс!

  • @skyjen5594
    @skyjen5594 3 года назад

    Я исполнил твою сихнронную операцию!

  • @vsevolodmetelsky1275
    @vsevolodmetelsky1275 3 года назад

    Отличное видео, спасибо.

  • @voltionboal9390
    @voltionboal9390 3 года назад

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

  • @KillerBestUselesmoun
    @KillerBestUselesmoun 3 года назад

    Крутая инфа с точки зрения понятий устройства async await методов внутри, но так как канал ориентирован на разработку на Unity, я ожидал увидеть практичное применение этих самых async await, рассмотреть отличия async await от корутин и как можно заменить эти самые корутины. Машина состояния - одновременно интересно и не понятно) особенно не понятно, где это можно применять)

    • @gaitavr1992
      @gaitavr1992  3 года назад

      На базовом уровне там нечего применять, я хотел рассказать о внутренностях, так как это мало кто знает. Разработка на юнити ведется на шарпе и кто им не владеет хорошо - ничего не сможет сделать толкового

    • @gaitavr1992
      @gaitavr1992  3 года назад +1

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

  • @stanislavsh6582
    @stanislavsh6582 3 года назад

    Хех, помню времена когда TPL не было. Хорошо, что те времена уже в прошлом. Не то чтобы я такой старый, просто шарп начал ковырять еще в школе.

  • @justlama0
    @justlama0 3 года назад

    Годнота)

  • @aa-ly9on
    @aa-ly9on 3 года назад

    Спасибо

  • @alexsklyarov6792
    @alexsklyarov6792 3 года назад +2

    Круто, еще б примеры где лучше применять async, а где IEnumerator, спасибо.

    • @gaitavr1992
      @gaitavr1992  3 года назад

      Так это разные вещи в плане применения. Async нужен для асинхронного выполнения метода. Ienumerator это перебор коллекции

    • @alexsklyarov6792
      @alexsklyarov6792 3 года назад

      @@gaitavr1992 я возможно не совсем понял ответ, но я имел ввиду когда используют coroutine и в методе есть такой код: yield return new WaitForSeconds(time), зарание спасибо)

    • @gaitavr1992
      @gaitavr1992  3 года назад +2

      Ну корутина только с gameobject работает и всегда в одном потоке. Async работает везде и можно настроить потоки. Для легких вещей корутина ок

    • @seldemirov
      @seldemirov 3 года назад

      @@gaitavr1992 Насколько я понимаю, async включает в себя весь функционал корутины и привыкнув к нему можно от корутин отказаться. Так ли это? Или есть случаи где так просто замену провести не получится?

    • @gaitavr1992
      @gaitavr1992  3 года назад +2

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

  • @rdragon587
    @rdragon587 3 года назад

    Cool) thanks

  • @AlexPlayer1000
    @AlexPlayer1000 3 года назад

    Было бы здорово в будущем увидеть уроки по UniRX сейчас на работе только их и используем

  • @mprils
    @mprils 3 года назад +1

    Хорошее видео, спасибо
    Однако
    Стоило рассказать как не нужно делать чтобы не получить дедлок
    А также, что цена этого всего удобства - аллокация памяти
    И если в обычном .нет вне юнити - это терпимо, то у юнити довольно печальный GC
    Поэтому что-то там поэвейтить в UI - это нормально, а вот создавать таски направо и налево в игровой логике - так себе идея

    • @gaitavr1992
      @gaitavr1992  3 года назад

      Примеров дедлоков куча в интернете, я не хотел еще затягивать и без того сложное видео. А про выделение памяти все сказано

  • @ruslan_yefimov
    @ruslan_yefimov 3 года назад

    Такой чёрной магии я не видел с тех пор, как пытался писать шейдеры..

  • @eyellen
    @eyellen Год назад +1

    Очень интересно, хотелось бы спросить, а где можно найти все эти тонкости языка ? А то я прошелся по возможностям языка, но теперь интересно как оно устроено внутри, хочется узнать все тонкости и детали, может есть какая-то книга ? Или где вообще можно найти об этом ?

  • @NoldoWalker
    @NoldoWalker 3 года назад

    Очень мощно, недавно начал сам изучать эту тему, а тут удачно подъехал видос. Я правильно понимаю, что объяснение про машину состояний - это про то что под капотом у асинк-авейта и в целом можно и без знания этого им пользоваться? Просто в этом месте я понимание потерял. Upd. Из примера про кнопку понял что только с базовыми типами. Надо будет довкурить, чтобы делать камтомные авейтеры на все подряд.

    • @gaitavr1992
      @gaitavr1992  3 года назад +1

      Все верно, стейт машина+эвейтер+каркасный метод и будет работать без async await

    • @NoldoWalker
      @NoldoWalker 3 года назад

      @@gaitavr1992 спасибо

  • @Bushido_Cat
    @Bushido_Cat 7 месяцев назад

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

  • @SterinGM
    @SterinGM 2 года назад +1

    Под WebGL это будет работать? У меня не получилось завести ((

  • @ОлегШинкаренко-х6в
    @ОлегШинкаренко-х6в 3 года назад

    хорошее видео, спасибо..можно сделать такое же, но про корутины ? как они под капотом работают и потом их сравнение с async/await

    • @gaitavr1992
      @gaitavr1992  3 года назад

      Как-нибудь дойдем

  • @ilyanazarov7001
    @ilyanazarov7001 3 года назад

    Спасибо за видео! Запустил у себя ваш кастомный awaiter, но обнаружил, что второй await также срабатывает при повторном нажатии button1. Результат при этом выводит такой же, как и при последовательном нажатии button1 и button2. Почему так?

  • @timurakhmetov5725
    @timurakhmetov5725 3 года назад

    Максим, спасибо за видео. У меня вопрос: где выполняется таска, которую мы await'им. Вот у нас есть асинхронный метод, мы его вызываем, он выполняется до первого await, в await у нас таска, выполняющая длительную операцию. после await управление возвращается, основной поток не блокируется, и выполняет другие операции. Но где выполняется таска: в основном потоке параллельно (хотя насколько я помню, поток может выполнять только 1 задачу), в другом потоке, берется он из пула и т.д.? И как с этим всем связана машина состояний?

    • @gaitavr1992
      @gaitavr1992  3 года назад

      Лучше еще раз посмотреть видео, особенно момент с самописными эвейтерами

  • @TheTalionn
    @TheTalionn 3 года назад +1

    А можно 1-2 примера, когда стоит все таки отправлять Task в отдельный поток?

    • @gaitavr1992
      @gaitavr1992  3 года назад +3

      Я делаю это при первой возможности, чтобы разгрузить главный и если я не работаю с юнити типами (gameobject, texture и тд)

    • @TheTalionn
      @TheTalionn 3 года назад

      @@gaitavr1992 спасибо

  • @МаксимВорошилов-о9о

    Await'ы, как я понял, лишь маркеры для компилятора, показывающие, как разбивать метод. Что будет, если между await'ами поставить goto? Например, {Label: await Task.Wait(1000); goto Label;} будет всего лишь бесконечный переход на состояние 1? Или такой подход может прям сломать async/await?

    • @gaitavr1992
      @gaitavr1992  2 года назад

      Мне такое никогда не пришлось бы попробовать. Я не использую goto в принципе, а вот в async/await он используется

    • @МаксимВорошилов-о9о
      @МаксимВорошилов-о9о 2 года назад

      @@gaitavr1992 а я все же проверил. Ничего не сломалось. Видимо, бесконечный переход на состояние 1

  • @ПростоЧеловек-р1з
    @ПростоЧеловек-р1з 3 года назад

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

  • @АльбертАвагян-м9т
    @АльбертАвагян-м9т 3 года назад

    Спасибо большое за видео. Очень интересно если бы ты рассказал про многопоточность в юнити. Например как работают корутины, в одном потоке ли работает юнити и если да, то по какой очередности запускаются скрипты? Спасибо еще раз

    • @gaitavr1992
      @gaitavr1992  3 года назад +1

      Судя по тому, что вы написали, присутствует сильная путаница. В рамках c# роликов сниму

  • @Nik0lay11
    @Nik0lay11 2 года назад

    Если есть таска t и у нее есть ContinueWith то нужно ли делать после ее создания await t - а то в видео говорится что авейтить целую конструкцию не получится(либо одно либо другое) но автор добавляет код "await t;"? Если авейт нужен то после него может быть еще код и другие авейты(которые отработают после ContinueWith?)? Если не нужен то как обработается ексепшн если он выбросится в ContinueWith?

  • @Tera-h7e
    @Tera-h7e Месяц назад

    Task.Yield() не до конца объяснил, в контексте Юнити это аналог yield return null для корутин

  • @peterpashchenko301
    @peterpashchenko301 2 года назад

    Круто. очень advanced, но увы весьма сложно для понимания. Кроме разных вариантов применения класса Task.

  • @nonamenoname5824
    @nonamenoname5824 3 года назад

    Good

  • @staskapanin
    @staskapanin 3 года назад

    Максим, что думаете по поводу последних двух абзацев(Avoid using async and await) из этой страницы документации Unity? docs.unity3d.com/Manual/overview-of-dot-net-in-unity.html Контекст синхронизации Unity всё равно заставляет работать всё в главном потоке и нужно использовать контекст по умолчанию или свой? Одинаково ли работает async/await в .NET и в Unity IL2CPP(на разных платформах, например UWP)?

    • @gaitavr1992
      @gaitavr1992  3 года назад +1

      Таски генерируют много мусора, что критично в узких горлышках(по ситуации смотрят). Если не указать какой синхронизационный контекст использовать, то все выполнится в том же потоке и проблем с unity типами не будет. А вот если эти типы не использовать, и не выполнять работу в том же контексте, то будет работать быстрее.

    • @gaitavr1992
      @gaitavr1992  3 года назад

      С uwp работал очень давно, когда еще таски не знал, сложно сказать. Ставлю на то, что будет работать

  • @alexspeleers
    @alexspeleers 3 года назад

    видел на каком-то буржуйском канале про стейт машину в асинк авейте, но там о билдерах/диспоузах ничё не говорили, как же хорошо что это всё под капотом и не надо гемороится. А кста разве оно не в IL код компилится, или вот тот С# код со свичами ты чисто для наглядности бахнул?

    • @gaitavr1992
      @gaitavr1992  3 года назад

      Это до IL кода, все await и async преобразуются в стейт машины и эвейтеры

  • @GaniSo
    @GaniSo Год назад

    жалко что у тебя перестали выходит видео (

  • @grinde_wald6888
    @grinde_wald6888 3 года назад

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

  • @tr0sty
    @tr0sty 3 года назад

    есть ли способ килять все асинхронные процессы, запущенные в коде, при выходе из play mode в эдиторе?

    • @gaitavr1992
      @gaitavr1992  3 года назад +1

      Я бы cancellation token использовал. Также при рекомпиляции таски очистятся

  • @modjaid3907
    @modjaid3907 3 года назад

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

    • @gaitavr1992
      @gaitavr1992  3 года назад

      Это один из инструментов, требоваться может только в том случае, если команда повсеместно его использует. Но скажу сразу, что если проект не очень стеснен в производительности , то там будет или UniRX или Task

  • @greemdim4611
    @greemdim4611 3 года назад

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

    • @gaitavr1992
      @gaitavr1992  3 года назад

      Если человек знает обычный шарп - у него нет проблем в юнити с этим)

    • @greemdim4611
      @greemdim4611 3 года назад

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

    • @gaitavr1992
      @gaitavr1992  3 года назад +1

      7й си шарп, вам нужно несколько вводных уроков пройти для начинающих, так как у меня контент ориентирован на повышение квалификации разработчиков junior +

  • @ВладимирКосмодемьянский-ф6м

    На слух очень сложно понять, вот бы код посмотреть

  • @alexspeleers
    @alexspeleers 3 года назад

    бекгрануд в паверпоинте - юзал в универе на каких-то презентациях (((:

  • @polarbar780
    @polarbar780 7 месяцев назад

    Вижу, что ролик общеобучающий. В этой ситуации объяснять различие между асинхронным программированием и многопоточностью в начале неправильно. Это сбивает людей с толку. Разумно сосредоточится на самом механизме,принципе его работы, а само различие объяснить в конце. Тем более,что это различие не касается самого механизма. Я могу с помощью async-await запустить две параллельные задачи, которые будут выполняться на CPU и это не какой-то крайней случай, а вполне распространенная практика. Да и сам термин "асинхронность" но никак не связан с CPU, скорее он означает процессы, выполняющиеся независимо друг от друга. Поэтому, есть ли разница в какой среде происходит это выполнение (на разных устройствах или одном cpu)? На мой взгляд нет. Всё твердят как догму "асинхронность не равно многопоточность", а я скажу, что в ряде случаев равно 😅 И что, я буду не прав?

  • @ViATVmy
    @ViATVmy 3 года назад

    Спасибо если можно и про

    • @gaitavr1992
      @gaitavr1992  3 года назад

      Про что?

    • @Gekker42
      @Gekker42 3 года назад +6

      @@gaitavr1992 походу он OperationCanceledException получил пока писал, а отправка сообщения уровнем выше стояла

  • @vasyalapuh2878
    @vasyalapuh2878 3 года назад +1

    Я понял что ничего не понял. Требуэ пересмотр.

  • @vasyalapuh2878
    @vasyalapuh2878 3 года назад +1

    Самое время написать что сложно с наскока понять.

  • @andrew_t800
    @andrew_t800 3 года назад

    Нрмас. Я не ожидал описания того что происходит "внутри". Много "кривой" инфы у других авторов - иногда прям бесит. Запили видос про потоки! Как и когда использовать, ато у меня весь проект изначально на корутинах, а вот выделили время на рефактор, но я в Юнити не силён в потоках - очень не хочется "перемудрить".

    • @gaitavr1992
      @gaitavr1992  3 года назад +2

      Дойдем и до потоков

  • @_EnVyUs
    @_EnVyUs 3 года назад +1

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

  • @addmusic1484
    @addmusic1484 3 года назад

    Люди у вас тоже ошибка: async не поддерживается 2.3 версии

  • @ilyakruglow6486
    @ilyakruglow6486 3 года назад

    я думал асинк не работает с монобехами

  • @malvislightfadynightgames2925
    @malvislightfadynightgames2925 3 года назад

    Так и не была раскрыта явная разница между многопоточностью и асинхронностью. На том же metanit объясняется лучше

  • @saasrus
    @saasrus 2 года назад +1

    Инфа очень плотная, это видос не на один раз, несмотря на небольшой хронометраж.

  • @coolrash
    @coolrash 3 года назад

    Нахрен мне этот async, если я никак не могу с ним взаимодейстовавать с игрой? Ну для вычисление всяких формул пойдет, но мне надо нормальный многопоточность и с нормальным доступом с основным потоком. А то там все нельзя ничего взять присвоимть. Вообще ничего нельзя. Только вычисление координаты х и то как это возвращать - тайна века. Кароче много поточность в юнити сосет

    • @gaitavr1992
      @gaitavr1992  3 года назад

      Что за высер?

    • @coolrash
      @coolrash 2 года назад

      @@gaitavr1992 я пытался генерировать коллайдер в реальном времени, изза этого в игре были фризы достаточно много кадров, что очень портило игру. Я хотел это в фоне обработать и передать в основной поток. Но как я понял, в юнити нету многопоточности с основным игровым потоком. Только эти координаты можно обработаьь и васё. А так тогда был излишне эмоционален, так как 1 месяц потратил на эту затею и не смог решить эту проблему.

  • @Andrei_Kozlov
    @Andrei_Kozlov 2 года назад

    При объяснении не хватает примеров в играх... по этому полное непонимание

  • @igorcoolman
    @igorcoolman Год назад +2

    первые 5 минут понятно, потом ересь какая-то

  • @malvislightfadynightgames2925
    @malvislightfadynightgames2925 3 года назад +1

    Опять цвета одинаковые. Как это понимать. Если бы цвета значимых типов и ссылочных типов были разные, то тебе не пришлось бы объяснять, что AsyncVoidMethodBuilder это структура. Не подумай, что я придираюсь, я просто хочу сделать из твоих шикарных знаний в виде видеоуроков ещё и удобную интерпретацию для впитывания этих знаний.

  • @ashotrustavelyan7498
    @ashotrustavelyan7498 Год назад

    в самом главном моменте обьяснения не обьяснил

  • @Дзмтрый-л9в
    @Дзмтрый-л9в 2 года назад

    Спасибо, было познавательно!

  • @Павел-ж6к4ъ
    @Павел-ж6к4ъ Год назад

    Спасибо за видео!

  • @СергейМалинов-щ5э
    @СергейМалинов-щ5э 3 года назад +1

    Спасибо за годный контент!)