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

2024 ж. 2 Мам.
34 297 Рет қаралды

В этом видео мы углубимся в async/await. Узнаем, почему асинхронность не равно много поточность, как устроен await внутри и как его применить к любому типу.
Ссылка на Discord - / discord
Делегаты и события - • Делегаты и события в u...
LINQ и свой итератор - • LINQ в C#. Продвинутое...
Расширяющие методы - • Что такое методы расши...
Паблик игроделов - vk.com/special3d
"00:00 - Введение"
"01:40 - Первый пример"
"03:55 - Синтаксис и условия компиляции"
"05:51 - Машина состояний"
"14:17 - Свой awaiter"
"16:24 - Полезные методы"
Поддержка канала:
Patreon - www.patreon.com/user?u=32502669
В крипте:
BTC - 16WmTb4VTFGYrwEjjnMKNNMMzsMB1rPEqD
ETH - 0x8d35406f8317b846528d0a9ea4a34ce59968dff2
XRP - rLW9gnQo7BQhU6igk5keqYnH3TVrCxGRzm (TAG - 1438215071)
LTC- MNSWdzdVsUMnozSU5HhUPEscfxaUK3Fdck
#unity3d #await #async #gamedev #ityoutubersru

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

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

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

    @Gekker42@Gekker423 жыл бұрын
    • Имеет смысл вернуть потом и еще глянуть после некоторой практической работы

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

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

    @toxicknight3079@toxicknight30793 жыл бұрын
  • дня 2 читаю про асинки, но это лучшее что я видел - и всего за 20 минут

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

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

    @inskips@inskips2 жыл бұрын
  • Хороший видос. Мощную работу проделал.

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

    @ve1c0m@ve1c0m3 жыл бұрын
  • Хороший контент, буду ждать второй части!

    @ell_pavel@ell_pavel2 жыл бұрын
  • Ты невероятно полезен!

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

    @simxan123@simxan123 Жыл бұрын
  • Спасибо за годный контент!)

    @user-vt9bh6fu4g@user-vt9bh6fu4g3 жыл бұрын
  • Спасибо за отличное видео. Даже опытным разработчикам помогает освежить знания.

    @kirill7637@kirill76372 жыл бұрын
  • Самый тематичный посыл подписаться в истории Ютуба)

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

    @tech_jp160@tech_jp160 Жыл бұрын
  • Спасибо . Как всегда на уровне

    @petrosaslanidis@petrosaslanidis3 жыл бұрын
  • Спасибо. И ещё четыре слова.

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

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

    @sergei-fil@sergei-fil2 жыл бұрын
  • Видео огонь 🔥 Узнал много нового

    @user-lg5se3nj1e@user-lg5se3nj1e3 жыл бұрын
  • Года 2 назад был бы такой видос, не было бы предела моей радости и задачу закрыл бы в срок xD Очень хорошо рассказано

    @MOQred@MOQred2 жыл бұрын
  • Спасибо, было познавательно!

    @user-nv6gj6hg2s@user-nv6gj6hg2s Жыл бұрын
  • Спасибо за видео!

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

    @voltionboal9390@voltionboal93903 жыл бұрын
  • Отличное видео, спасибо.

    @vsevolodmetelsky1275@vsevolodmetelsky12753 жыл бұрын
  • Спасибо, помогло в работе

    @user-hn3lf4nx8o@user-hn3lf4nx8o2 жыл бұрын
  • Круто рассказал!

    @avaloniuss@avaloniussАй бұрын
  • Годнота)

    @justlama0@justlama03 жыл бұрын
  • Круто, Макс!

    @andrewmad@andrewmad3 жыл бұрын
  • Кайф. Спасибо!

    @easycodeunity3d14@easycodeunity3d142 жыл бұрын
  • Круто, жду продолжения !

    @user-bn6bs9qk1z@user-bn6bs9qk1z3 жыл бұрын
    • На эту же тему?

      @gaitavr1992@gaitavr19923 жыл бұрын
  • Понял где то половину, наверное....) Очень интересно, спасибо!

    @user-pd9eq4dq7n@user-pd9eq4dq7n3 жыл бұрын
    • Когда понадобится свой эвейтер или случится странное поведение, то можно попробовать посмотреть еще раз)

      @gaitavr1992@gaitavr19923 жыл бұрын
  • просто отлично

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

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

      @user-qb8lx2uq5j@user-qb8lx2uq5j7 ай бұрын
  • Сама тема классная, да и голос что надо. Чего мне реально не хватает, это дельных примеров (желательно простоватых), где это конкретно стоило бы применить. А так, спасибо, очень познавательно.

    @user-tf9lo4fi4m@user-tf9lo4fi4m3 жыл бұрын
    • Этот ролик про то, как работает изнутри, естественно он предполагает опыт использования тасок. В интернете куча примеров для новичков есть, в том числе рунете

      @gaitavr1992@gaitavr19923 жыл бұрын
  • Спасибо

    @aa-ly9on@aa-ly9on2 жыл бұрын
  • Я исполнил твою сихнронную операцию!

    @skyjen5594@skyjen55942 жыл бұрын
  • Cool) thanks

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

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

    @stanislavsh6582@stanislavsh65822 жыл бұрын
  • Я от Сакутина. Очень благодарен ему за рекламу и тебе за познавательное видео.

    @orik9242@orik92422 жыл бұрын
    • Я ему тоже благодарен, бустанул мне канал очень хорошо)

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

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

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

      @gaitavr1992@gaitavr19923 жыл бұрын
  • Good

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

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

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

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

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

    @user-xi6lq7iy4t@user-xi6lq7iy4t3 жыл бұрын
    • Как-нибудь дойдем

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

    @NoldoWalker@NoldoWalker3 жыл бұрын
    • Все верно, стейт машина+эвейтер+каркасный метод и будет работать без async await

      @gaitavr1992@gaitavr19923 жыл бұрын
    • @@gaitavr1992 спасибо

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

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

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

      @gaitavr1992@gaitavr19923 жыл бұрын
  • Такой чёрной магии я не видел с тех пор, как пытался писать шейдеры..

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

    @user-bc4me5kz7j@user-bc4me5kz7j3 жыл бұрын
    • Судя по тому, что вы написали, присутствует сильная путаница. В рамках c# роликов сниму

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

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

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

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

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

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

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

      @gaitavr1992@gaitavr19923 жыл бұрын
  • Под WebGL это будет работать? У меня не получилось завести ((

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

    @timurakhmetov5725@timurakhmetov57252 жыл бұрын
    • Лучше еще раз посмотреть видео, особенно момент с самописными эвейтерами

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

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

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

      @gaitavr1992@gaitavr19922 жыл бұрын
  • бекгрануд в паверпоинте - юзал в универе на каких-то презентациях (((:

    @alexspeleers@alexspeleers3 жыл бұрын
  • Спасибо если можно и про

    @ViATVmy@ViATVmy3 жыл бұрын
    • Про что?

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

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

    @user-sj6rx9yu8y@user-sj6rx9yu8y2 жыл бұрын
    • Мне такое никогда не пришлось бы попробовать. Я не использую goto в принципе, а вот в async/await он используется

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

      @user-sj6rx9yu8y@user-sj6rx9yu8y2 жыл бұрын
  • А можно 1-2 примера, когда стоит все таки отправлять Task в отдельный поток?

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

      @gaitavr1992@gaitavr19923 жыл бұрын
    • @@gaitavr1992 спасибо

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

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

      @gaitavr1992@gaitavr19923 жыл бұрын
  • Самое время написать что сложно с наскока понять.

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

    @alexspeleers@alexspeleers3 жыл бұрын
    • Это до IL кода, все await и async преобразуются в стейт машины и эвейтеры

      @gaitavr1992@gaitavr19923 жыл бұрын
  • жалко что у тебя перестали выходит видео (

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

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

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

    @user-oe4op3bk1g@user-oe4op3bk1g2 жыл бұрын
  • А как вы смотрите на то, чтобы создать плейлист по сишарпу на юнити для людей, которые знают только основы обычного сишарпа?

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

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

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

      @gaitavr1992@gaitavr19923 жыл бұрын
  • Я понял что ничего не понял. Требуэ пересмотр.

    @vasyalapuh2878@vasyalapuh28782 жыл бұрын
  • я думал асинк не работает с монобехами

    @ilyakruglow6486@ilyakruglow64862 жыл бұрын
  • Люди у вас тоже ошибка: async не поддерживается 2.3 версии

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

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

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

    @andrew_t800@andrew_t8003 жыл бұрын
    • Дойдем и до потоков

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

    @_EnVyUs@_EnVyUs3 жыл бұрын
    • Не надо так)

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

    @saasrus@saasrus Жыл бұрын
  • первые 5 минут понятно, потом ересь какая-то

    @igorcoolman@igorcoolman9 ай бұрын
  • При объяснении не хватает примеров в играх... по этому полное непонимание

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

    @coolrash@coolrash2 жыл бұрын
    • Что за высер?

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

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

    @malvislightfadynightgames2925@malvislightfadynightgames29252 жыл бұрын
  • в самом главном моменте обьяснения не обьяснил

    @ashotrustavelyan7498@ashotrustavelyan74986 ай бұрын
  • Спасибо за видео!

    @belousov_it@belousov_it2 жыл бұрын
KZhead