🏎️ Многопоточность в Unity - Minecraft часть 9

Поділитися
Вставка
  • Опубліковано 28 вер 2024

КОМЕНТАРІ • 97

  • @Vorono4ka
    @Vorono4ka Рік тому +16

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

  • @VursPZ
    @VursPZ Рік тому +31

    Жаль что следующая серия последняя. Узнать ещё что-то новое на примере майнкрафта было бы интересно. Спасибо за ролики

    • @лшд
      @лшд 9 місяців тому

      Как ты такой стикер сделал😮

    • @lev431
      @lev431 5 місяців тому +2

      Мож спонсорский​@@лшд

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

  • @LAKERBorisEleseenko
    @LAKERBorisEleseenko 5 місяців тому +14

    Где видосы?

  • @ДенисОлейник-э6е

    Вы - это офигенный мотиватор чему-то учиться :)

  • @иванираннок
    @иванираннок 11 місяців тому +1

    А вообще конечно Автору респект и уважуха! ))
    Очень годный сделан гайд - Спасибо! ))

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

    ура ти повернувся так довго тебе чекав чел просто шик

  • @ІгорЛисенко-ж9н
    @ІгорЛисенко-ж9н Рік тому +1

    Ещё можно использовать ECS, это бомбическая штука.

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

    спасибо за видео! очень интересно смотреть

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

    Очень хочется увидеть мультиплеер в 3D песочнице

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

    Сделай реализацию всех механик portal 2: порталы и портальная пушка("Старый видео урок впринципе есть"), поднятие предметов, кнопки обычные и нажимные, гели, мосты, раздатчики.

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

    Прив! Когда выложишь исходники или игру?

  • @Abuir1
    @Abuir1 8 місяців тому +2

    слушай, а можешь сделать ролик, где расскажешь всё про свет? как настраивать, какие есть приколы и т.п., ну как делал раньше про звук там, анимации

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

    Может продолжишь майн? Добавишь спавны деревьев и разные блоки)

  • @AkFoolOfficial
    @AkFoolOfficial Рік тому +10

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

    • @elitdie
      @elitdie Рік тому +4

      lodы в играх с процедурной генерацией ландшафта это жестоко

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

      @@elitdie но это неплохая идея, видел мод для майна, который добавляет лоды чанкам. Отличная вещь, к тому же рабочая

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

      @@eennou реализовать можно хоть сову на глобусе. Вопрос на каком компе это будет играться и как быстро

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

      @@elitdie генерация лодов не сильно нагружает, она по идее наоборот должна уменьшить нагрузку

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

      @@eennou чтобы сгенерировать Лод, вам надо сначала высчитать этот далёкий чаек. Соответственно дальность прорисовки должна быть увеличена. Можно переписать алгоритм чтобы он сначала высокие лоды создавал а потом уплотнял сетку.

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

    Привет. Спасибо за крутую серию уроков. А будет ссылка на репозиторий проекта?

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

    У меня есть идея для следующей игры

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

    Срочно нужно добавить динамит 😂

  • @sashakuzin4458
    @sashakuzin4458 10 місяців тому +1

    Это всё, последнее видео? Уже три месяца нет новостей....

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

    Не шарю за сишарп, но разве тут нету реордеринга операций, read mem barrier, типа как в джяве? Применительно к коду, где в треде меняется chunkData без каких-либо примитивов синхронизации

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

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

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

      @@EmeraldPowder в Джаве компилятор в такой ситуации может просто реордеринг сделать операций - тоесть сначала выставить поле state, и только потом предыдущую операцию. Тоесть без барьеров нету гарантии порядка выполнения операций. И такое есть в других языках, включая си/си++, раст и т.д. Поэтому я ожидаю что в сишарпе тож самое должно быть.

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

      @@mitallast вот кстати не знаю про это, может быть и есть тут какая-то опасность. Точно знаю что С такого не сделает, потому что там в стандарте ; это sequence point. А в С# я когда-то ковырялся в байткоде, и видел что он там вообще по минимуму оптимизировал во время компиляции, но вот что об этом стандарт говорит честно говоря совсем не знаю

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

    Есть идея для игры, бесплатно дарю: игра похожая по механике на смесь Crossout и Space Engineers. Создаешь кораблики для боя и абордажа из маленьких кубиков (10*10*10 см), треугольников и тд (корпус), а так же функциональных модулей вроде оружия, двигателей, выдвижных панелей под другие модули, сборных конструкций вроде лифтов и тд. А потом в быстрый бой против других игроков или ИИ. Что бы не делать сложную физику разрушений и дать возможность игрокам по-настоящему творить шедевры за счет оптимизации и упрощений, корабль нельзя порвать на части как в SE, поскольку будет прозрачное поле структурной целостности, хотя можно пролезть через него персонажем. За баланс отвечают исключительно модули, навыки персонажа и модификаторы для модулей, но не вид корабля. Главное отличие такой игры от любой другой в том, что вам не нужно строить кирпич что бы быть эффективным, а значит вы сможете создавать самые красивые корабли и быть таким же опасным. Пока что игры, предлагающие возможности по постройке сложных красивых кораблей для боя или шутера от первого лица, слишком сложны, перегружены игровыми механиками и слишком несбалансированные. Прокачка по модели Crossout вполне подходит, надо лишь добавить прокачку навыков для игрока. Большими кораблями можно управлять нескольким игроками, сделать корабль матрешку (авианосец) или держать оборону от десанта в тесных коридорах придуманного тобою корабля. В дальнейшем можно создать больше миссий или даже большой динамичный мир как в EVE. Просто, потрясающе красиво, вариативно и сбалансировано

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

      Похоже на Robocraft по описанию, он был когда-то хорош

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

      @@EmeraldPowder , я играл и нет, не похож. Робокрафт очередной представитель жиромобилей. Побеждал не тот кто лучше стреляет, а тот кто сделает самый жирный крафт по технике трифорс (слои не соединялись друг с другом и от того урон не проходил дальше, похоже на ДЗ). Моя же идея в том, что хоть ты построишь тонкий nebulon-b, хоть толстую звезду смерти, победу определят свои способности стрелять и то какие пушки и модули стоят у тебя, а не форма корпуса. Т.Е. Нельзя пальнуть в место сочленения двух половинок корпуса и надеяться что одна из них отвалится. Как результат люди будут стараться сделать не уродливые эффективные коробки, а боевые арткрафты. Именно этого не хватает мне буквально в любой подобной игре. Просто невозможно построить что-то впечатляюще красивое и одновременно эффективное

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

    Привет, а что делает => такой значек до тела метода? Выполняет тело метода, без вызова? Сильно не ругайте если вопрос простой

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

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

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

    А как на счет контекста синхронизации?)

  • @g.i.f7838
    @g.i.f7838 Рік тому +1

    Слава палигонам, ты не помер, и хорошо!

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

    Асинхронность не равно многопоточность. Посмотри реализацию UnitySyncronizationContext.

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

    А чанки деспавнятся? Иначе при достаточно большом мире игра умрёт

  • @maymaks
    @maymaks 10 місяців тому +1

    Где новое видео, сколько можно ждать?

  • @лшд
    @лшд 9 місяців тому

    Где скачать?

  • @proxy.market
    @proxy.market 11 місяців тому

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

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

    Сделай реки и озёра пожалуйста

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

    А потом попробуете сделать "Terraria"?

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

    я буквально на прошлой неделе писал бота для дискорда и как раз столкнулся с потоками, асинхронностью и падениями "потому что гладилоус", я ща смотрю видео и меня прям накрывает флешбеками как я всё это дебажил. Усугубляло, что я впервые писал на питоне и матерился после node.js просто адски....

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

      Да, потоки это наверное самое сложное для дебага, даже сложнее какого-нибудь мультиплеера. На питоне не знаю, но я вспоминаю как на С в универе писал через Юниксовые POSIX Threads, тогда C# с юнити перестаёт пугать)

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

    await load()
    await create()
    load(){
    var tasks = new List
    foreach(var c in chunks)
    task.Add(loadChunk(c));
    await Task.WhenAll(tasks);
    }
    змінити await на yield return - сенс той самий

  • @graffitpro9293
    @graffitpro9293 Рік тому +4

    Интересно было бы посмотреть на реализацию генерации чанков через юнитивеские джобы, в синтетических тестах они почти в 3 раза быстрее тасков, и это не применяя распараллеливания (IJobParallelFor)

    • @sergey-shevtsov
      @sergey-shevtsov Рік тому +2

      Да и вообще интересно было бы посмотреть на примере этого проекта всю связку: ECS, Burst Compiler и C# Job System.

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

    У меня есть идея для следующей игры

  • @RRUUSSTTXD
    @RRUUSSTTXD Рік тому +5

    Снова новая часть! Ура!

  • @bekbekovv111
    @bekbekovv111 Місяць тому +1

    мистер изумруд, вернитесь, мир умирает без ваших уроков... :(

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

    Таски, корутины. Автор ты совсем на голову болеешь? Это юнити, тут есть jobs + burst. Трансляция в LLVM вот это всё. Ну да, ну да, пошёл я ... )

    • @ВалентинаМозжерина-ш1р
      @ВалентинаМозжерина-ш1р Рік тому +1

      Иди, иди.....

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

      @@ВалентинаМозжерина-ш1ра вот и комментарии от ограниченных в когнитивных способностях подъехали.

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

    Было бы интересно посмотреть, можно ли таски заменить на Job`ы от юнити. К тому же будут видна отработка воркеров в профайлере. К тому же - будут сыпаться ошибки в какой джобе что-то пошло не так. В теории - отладка удобнее станет
    И если выйдет - сравнить результаты производительности.

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

      Можно использоватт джобы)

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

    Подпишусь 👍👍

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

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

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

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

  • @OleksiiDemanov
    @OleksiiDemanov Місяць тому

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

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

    ОН ЖИВОЙ, боже, обожаю ролики с этого канала)

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

    Оп-оп, как быстро вышло! Круто

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

    А если сделать меш чанка статик батчинг ?

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

      Тут меш каждого чанка разный, бесполезно

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

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

  • @SoulScreamPlay
    @SoulScreamPlay 11 місяців тому

    Это канал Артёма который про Блендер рассказывал? Голос очень похож.

  • @иванираннок
    @иванираннок 11 місяців тому

    Так же криво получилось самому сделать аналоги GenerateRightSide для других сторон (Вы сделали это после их переноса в MeshBuilder "за кадром" - но так и не показали нигде итог - чуть видно по левой стороне а остальные нет - поэтому часть сторон в проекте кривые)

  • @13-jz3nr
    @13-jz3nr Рік тому

    Заведи себе бусти плз, есть ещё масса не освещенных тем)

  • @Shineglow
    @Shineglow Місяць тому

    Изумрудик, мы тебя ждём.

  • @NEKAlinka
    @NEKAlinka 4 місяці тому +1

    Жаль, что видео больше не выходят

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

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

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

      @@Saltant ну, я примерно так и думал. Но все равно жалко. Контент классный

    • @Saltant
      @Saltant 4 місяці тому +1

      @@NEKAlinka Да, один из немногих русскоязычных каналов по кодингу и юнити в том числе где видосы реально чего то стоят, а не просто видос ради видоса. Так что, я смотрю как выходит, можно и раз в год, мне торопиться некуда :)

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

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

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

      Да, такой баг есть пока, спасибо. Когда инпутом займусь обязательно поправлю

  • @demich11111
    @demich11111 7 місяців тому +2

    Здравствуйте, у меня есть предложение для вас, как с вами связаться?

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

    В чем код пишешь?

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

    Все хорошо, но Any я бы убрал из цикла и корутины, замена на простой цикл через for с пробегом по коллекции избавит от тупой аллокации в Any (linq не для геймдева, просто посмотрите профайлером). Любые аллокации, которых можно просто избежать переписав код, дадут больше профита на дистанции, чем красивый стройный код. Не надо приучивать людей к linq в рантайме, просто поверьте боли многих коммерческих проектов. Для редактора - пожалуйста, здесь проблем нет.

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

      Можно просто метод сделать вместо лямбды и не будет аллокаций

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

      Там не только лямбда даст алоки

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

      @@darkmax85 У Any All Count нет аллокаций кроме неявной от лямбды же

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

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

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

    Привет, я решил повторить твою систему но столкнулся с багом, попробуй по копать блоки в -x, -z стороны. Знаю ты фиксил что-то подобное но если копать в - координаты где-то блоков 15-20 то на 1 участке начнёт выдавать ошибку (Null Ref), у тебя такой ошибки нет ?
    Попробуй пожалуйста.

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

      Был такой баг, я его мимолётом фиксил не в той части, вот тут: ua-cam.com/video/z6W1a3IIT3k/v-deo.html
      После этого вроде нигде не падало, где бы ни копал

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

      @@EmeraldPowder Привет, прости что так долго, но я думаю что ты меня не совсем правильно понял. Данный баг заключается в функции "GetChunkContainingBlock()", Я его решил, если нужно будет более подробное объяснение то могу кинуть решение.

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

      Суть его в том что если ChunkWidth 32 то тогда любой блок на координатах x:-32 или z:-32 (+-1 блок) не получится вскопать или поставить.

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

    Спасибо тебе. Твоя работа и этот канал вдохновляет.

  • @иванираннок
    @иванираннок 11 місяців тому

    Очередной раз откатил проект и заново выполнил за ментором эту часть.
    Возникает критическая ошибка при запуске сцены (спотыкается на таске террейна в LoadChunkAt).
    Это кусок видео-гайда с 7 по 15 минуту. Перепроверил сбился со счета сколько раз. Все так, а не запускается ((
    как и ментор убрал из GetBlockAtPosition у МешБилдера проверки навроде if (chunkData.ChunkLeft == null) return BlockType.Air;
    Не помогает! ((
    При старте сцены сразу получаю в таске террейна 169 входов в зону try (уведомления) и 148 в зону catch (ошибки).
    Затем с 50го фрейма по 80й по +1 входу в зону try. На сцене появляется единственный чанк (правда персонаж давно в свободном падении и не видит его). Больше ничего не происходит.
    Ментор будь добр - нужен совет опытного в этом деле ))

  • @иванираннок
    @иванираннок 11 місяців тому

    Два вечера подряд пытаюсь устранить появившуюся в этой части ошибку. Никак. Пересмотр гайда не помог. Обсуждения на форумах пока тоже ((
    ArgumentException: An item with the same key has already been added. Key: (-6, -6)
    System.Collections.Generic.Dictionary`2[TKey,TValue].TryInsert (TKey key, TValue value, System.Collections.Generic.InsertionBehavior behavior) (at :0)
    System.Collections.Generic.Dictionary`2[TKey,TValue].Add (TKey key, TValue value) (at :0)
    PW.GameWorld.LoadChunkAt (UnityEngine.Vector2Int chunkPosition) (at Assets/PW/Scripts/GameWorld.cs:170)
    PW.GameWorld+d__15.MoveNext () (at Assets/PW/Scripts/GameWorld.cs:116)
    UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at :0)
    UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator)
    PW.GameWorld:Start() (at Assets/PW/Scripts/GameWorld.cs:96)

    • @иванираннок
      @иванираннок 11 місяців тому

      Причина была в том, что после очередного рефакторинга кода оказалось 2 вызова ChunkDatas.Add(chunkPosition, chunkData);
      Устранил, - старая ошибка ушла, пришла обещанная автором (ради отлавливания которой писал catch (Exception e) ...)
      Object reference not set to an instance of an object
      UnityEngine.Debug:LogError (object)
      PW.GameWorld/c__DisplayClass16_0:b__0 () (at Assets/PW/Scripts/GameWorld.cs:178)
      System.Threading._ThreadPoolWaitCallback:PerformWaitCallback ()

    • @иванираннок
      @иванираннок 11 місяців тому

      При этом вроде как до каждого символа все перепроверил по видео. Опробовал все 3 варианта ожидайки. Ошибки висят.
      // ожидайка подгрузки Всех соседей чанка
      //yield return new WaitWhile(() => {
      // foreach (ChunkData c in loadingChunks) {
      // if(c.State == ChunkDataState.StartedLoading) return true;
      // }
      // return false;
      //});
      //yield return new WaitWhile(() => {
      // return loadingChunks.Any(c => c.State == ChunkDataState.StartedLoading);
      //});
      while (loadingChunks.Any(c => c.State == ChunkDataState.StartedLoading)) {
      yield return null;
      };