Кирилл Надеждин (Kumo Kairo) - ECS в разработке игр - хорошая архитектура приложений для всех

Поділитися
Вставка
  • Опубліковано 28 гру 2017
  • Убираем ООП и заменяем его ECS (Компонентной системой сущностей). Кирилл расскажет вам об отличной архитектуре приложений для всех.
    Презентация: www.slideshare.net/flashgamm/...
    Доклады Кирилла:
    - Unity Scriptable Render Pipeline. В кастомизацию рендеринга с головой (2019) - • Кирилл Надеждин (SWAG ...
    - Оптимизация мобильной графики в Unity - полевые исследования (2018) - • Кирилл Надеждин (SWAG ...
  • Ігри

КОМЕНТАРІ • 42

  • @Bisirsky
    @Bisirsky 2 роки тому +6

    Ох, вовремя нашёл. Лучше поздно, чем очень поздно.
    Отдельно отмечу подачу. Прямо кайф. Талантливо!

  • @bonbeart
    @bonbeart 5 років тому +4

    Отличный доклад и хороший разбор вопросов!
    Много интересного, Спасибо!

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

    Отличный доклад и шикарные вопросы/ответы! Спасибо большое! :3

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

    ECS makes perfect sense to me. Awesome.

  • @AndreySarafanov
    @AndreySarafanov 6 років тому +3

    Отличная лекция! Благодарю!

    • @JosefKneht
      @JosefKneht 4 роки тому

      Не знал, Андрюха, что ты кроме 3Д еще и программированием занимаешься )

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

    смотрю об этом в 2021 --___--

  • @KhalilArafan
    @KhalilArafan 5 років тому +5

    yay, likereactivesystem just went 100 after my input changed the pool :) great talk ! cheers from Morocco !

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

    A very good lecture.

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

    Подскажите есть ли что-то общее между системами трюков и обработчиками в паттерне(Chain of Responsibility)?

  • @artemhovaev8076
    @artemhovaev8076 6 років тому

    Отличная лекция! Присматриваюсь к Entitas и возник вопрос, поднимал его в чате entitas, но пока не получил точного ответа. Собственно вопрос в том, можно ли подружить ООП модель данных с ECS логикой и как это сделать, или этого делать не стоит?
    Пример: Есть third party бэкенд фреймворк включающий ООП модель данных для внутриигрового магазина и инвентаря игрока, реализованную в виде классов Shop, ShopItem, Inventory, InventoryItem. И мы хотим построить ECS UI для магазина.

    • @iceX33
      @iceX33 6 років тому

      Если есть ООП модель и не хочется её полностью зеркалить в компонентах, то стоит создать как минимум компонент которой держит ссылку на головной объект модели. Плюс, эвенты из модели нужно прозеркалить как компоненты, тогда реактивные системы смогут работать при изменениях в ООП модели.

  • @unitynavigator3328
    @unitynavigator3328 5 років тому +2

    Для совсем начинающих в архитектуру, есть на русском / наглядные диаграммы? Или видео уроки / курсы?

    • @drVatman
      @drVatman 5 років тому +1

      Не знаю, поможет ли, но есть хорошая статья про другой ECS www.ibm.com/developerworks/ru/library/os-Ash/index.html . А вот тут его исходники и пример демо проекта github.com/richardlord/Ash .
      Там правда фреймворк для флеша. Но язык сильно похож на C# и я думаю особых сложностей не будет.
      И еще, код самого того движка понять сложно (там происходит довольно неочевидная магия), поэтому если вы новичёк то смотрите только демо проект и статью.

  • @user-ew9mc6mt1f
    @user-ew9mc6mt1f 3 роки тому +2

    Я вот не понимаю, как использовать фичи Юнити, пользуясь ECS
    Как использовать коллайдеры тогда? OnCollisionEnter например
    И как эти компоненты лепить на объекты вообще?

    • @bogdan4760
      @bogdan4760 8 місяців тому +1

      Монобех обработчик. Создайте монобех компонент с OnCollisionEnter(), который в себе уже будет помечать привязанную к этому геймобджекту энтити как столкнувшуюся: entity.isCollided = true; entity.AddCollisionId(*id энтити которая столкнулась с этим геймобджектом*)

  • @unitynavigator3328
    @unitynavigator3328 4 роки тому +1

    дайте пример на зверях в консоли )))

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

    27:05 ок, го 😀

  • @atlasua2021
    @atlasua2021 4 роки тому +7

    Попал на этот видос ибо всегда писал игры одним классом)

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

      Dont know if anyone cares but if you guys are stoned like me during the covid times then you can stream pretty much all the latest movies on instaflixxer. Have been watching with my girlfriend for the last couple of months xD

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

      @Kristopher Gunnar Yup, been watching on InstaFlixxer for since december myself =)

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

      @Kristopher Gunnar Yup, have been using InstaFlixxer for since november myself :)

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

    Ну шо потомки, как у вас с ECS спустя 5 лет?!)))

  • @xfg9183
    @xfg9183 5 років тому +2

    Я разбил компоненты на группы, каждая группа обрабатывается своей системой, но что делать, если для обработки одной группы требуются данные из другой группы? У меня есть 2D спрайты в 3D окружении и мне нужно поворачивать их лицом к камере (игроку). Для этого системе, которая поворачивает спрайты нужно знать позицию камеры (игрока). То есть уже не получается счастливый мир в котором система просто берет одну группу компонентов и обрабатывает её. Теперь ей нужны две разные группы компонентов, чтобы выполнить свои вычисления. Об этом почему-то нигде не пишут вообще, как это правильно делать и можно ли как-то избежать этой проблемы.

    • @user-vw2sb6wi2m
      @user-vw2sb6wi2m 4 роки тому +8

      Система принимает на вход какие-то данные и что-то делает. Все. Если тебе нужны данные, которые не приходят на вход - значит у тебя там неправильная архитектура. Easy.

    • @5_funger
      @5_funger 2 місяці тому

      Не нужно стараться распихивать компоненты по абстракциям(группам)
      Проблема, когда одна система должна знать о данных, которые обрабатывает(изменяет, пишет) другая система - это не проблема, это не запрещено.
      Самое главное соблюдать принцип: в одни данные ПИШЕТ только ОДНА система, а ЧИТАТЬ могут сколько угодно систем
      Если позиция игрока изменяется одной системой, то системе, которая работает с камерой не запрещено читать позицию игрока

  • @xfg9183
    @xfg9183 5 років тому +1

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

    • @sasichkamega
      @sasichkamega 4 роки тому

      Ну да, вектор же каждый день меняется.

    • @xfg9183
      @xfg9183 4 роки тому

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

    • @sasichkamega
      @sasichkamega 4 роки тому

      @@xfg9183 а в чем тогда, собственно, проблема, если интерфейс остался не тронутым?

    • @sasichkamega
      @sasichkamega 4 роки тому +1

      @@xfg9183 взял ты библиотеку с реализованным вектором, написал proxy класс, вдруг библиотеку забросили, но твой код завязан на интерфейс прокси класса, взял да переписал его на другой вектор из другой не заброшенной библиотеки.
      А вообще не вижу смысла использовать не std::vector.

    • @xfg9183
      @xfg9183 4 роки тому

      @@sasichkamega я об этом же. Но как-то странно передавать в систему обьект вектора, чтобы потом через него же пытаться создавать новые экземпляры векторов внутри системы. Хотел просто увидеть как другие делают. Реализации вроде std::vector не во всех языках.

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

    30:36 тестовое задания кто нибудь нашёл?

  • @AntonioModer
    @AntonioModer 6 років тому +1

    ECS в Юнити работает с самого начала (с 2005 года), только корявая немного. В Анриле она тоже есть, но смешана с ООП. Не понимаю, зачем писать для Юнити одно и тоже, тем-более корявее, когда в Юнити эта система есть и работает.
    Более подробно я написал тут:
    www.gamedev.ru/code/forum/?id=215818&page=4#m47
    www.gamedev.ru/code/forum/?id=215818&page=4#m51

    • @iceX33
      @iceX33 6 років тому +7

      Забавно читать такие комменты в 2018 году, когда в 2017 "CTO" Unity на Unite Europe огласил, что только началась разработка Unity ECS. А на GDC 2018 они представили несколько докладов, оглашая ECS как будушее скриптинга в Unity. www.twitch.tv/videos/241945353

    • @DmitryKozlovtsev
      @DmitryKozlovtsev 6 років тому

      Блин, я не думал, что ты говоришь по-русски, может ещё и Саймон тоже? )

    • @iceX33
      @iceX33 6 років тому +1

      Не Саймон, не говорит. А я made in Саратов, хотя большую часть жизни провел в Германии.

  • @xfg9183
    @xfg9183 5 років тому +2

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

    • @user-fe1nr3ws1z
      @user-fe1nr3ws1z 5 років тому +2

      В ECS код заранее сломан, так как сущности могут изменяться хаотично.
      Поэтому системы ничего не знают о сущностях (для систем сущность - это лишь номер).
      И соотвественно задача систем определить: является ли данный номер адекватным для обработки.

    • @xfg9183
      @xfg9183 5 років тому +1

      ​@@user-fe1nr3ws1z согласно шаблону всё понятно, в компонентах - данные, в системах - логика. На деле же у всех сделано по разному, в unity полно синглтон сервисов типа Input, в компонентах полно инфраструктурного кода, а коллизии между объектами вообще просчитываются где-то на уровне самого движка и бросаются события. Я не понимаю как в конечном счете должен быть структурирован код в этой архитектуре, чтобы всё это не превратилось в кашу.