ФлеймФорумПроЭкты

Движок AsEn

Страницы: 1 2 316 17 Следующая »
#0
(Правка: 16 авг 2024, 10:00) 12:49, 5 июня 2023

Раз в сколько-то лет я создаю такую тему.

Начало разработки: периодически 2018-2022, с 2022 более активно.

Язык: C++17 (опционально часть фич из C++20)
Платформы: Windows, Android, Linux, MacOS, Emscripten (без графики).
GAPI: Vulkan, Metal.
Шейдеры: GLSL, MSL.

Архитектурно основан на публикациях idTech (Дум/Вольфенштейн) и REDEngine (киберпанк). Движок полностью асинхронный, с кастомными аллокаторами и тд.

Исходники: gitflic, github.
Бинарники в артефактах CI на github.

Фичи:

  • TaskScheduler - планировщик задач, lock-free очереди, зависимости между тасками и тд. Есть обнаружение повисших тасков.
  • RenderTaskScheduler - планировщик задач для GPU, позволяет синхронизировать их с CPU тасками.
  • RenderGraph - максимально простой, без сортировки тасков, но без оверхэда. Поддерживает exclusive sharing для асинк компьюта, чего нет у многих аналогов.
  • Скрывает синхронизации на CPU и GPU, вместо этого используются зависимости между тасками.
  • Все модные фичи Vulkan и Metal (Mesh shader, RTX, async compute).
  • ECS на архетипах.
  • Модная асинхронщина: таски, промисы, корутины, асинхронное чтение файла и тд.
  • Профайлеры: тасков (CPU time), графики (GPU time), вендорские (NVPerf, Mali, Adreno).
  • Предкомпиляция всех ресурсов, встроенная валидация проверяет совместимость с разным железом - принцип "если скомпилировалось, значит будет работать".
  • + Примеры_кода


    Планы
    Нискоуровневые фичи сделаны, буду доделывать высокоуровневые: звук, репликация ECS и тд.

    Редактор шейдеров
    Используется для прототипирования различных техник. Расположен в 'AE/samples/res_editor'.
    Примеры шейдеров + скриншоты на gitflic, github.
    Фичи:

  • Код пишется на скриптах.
  • Быстрая перезагрузка скриптов и шейдеров.
  • Слайдеры и колорпикеры для переменных в шейдере.
  • Встроенная отладка и профилирование шейдеров.
  • Контроллеры: 2Д, FPV камера (как в шутере), Flight camera (авиасимы).
  • Шаблоны геометрии: партиклы, сферический куб с тангенциальной проекцией (скайбокс, планеты), ландшафт.
  • Совместимость с shadertoy
  • Поддерживает mesh shader, RTX.
  • Поддерживает VR, есть эмуляция VR, чтоб тестировать без шлема.
  • Асинхроный стриминг ресурсов (без лагов).
  • Запись видео, скриншоты, экспорт текстур/геометрии.
  • Удаленный запуск рендера на мобилке
  • Поддержка HDR мониторов.

  • Эта тема для обсуждения движкописательства, архитектуры, асинхронщины и тд.

    #1
    13:27, 5 июня 2023

    Моё имхо - асинхронный код в стиле .then это порождение сатаны затрудняющее и уничтожающее простоту понимания кода.
    Поэтому изобрели асинхронные функции в языках что это поддерживают, иначе просто архисложно понимать что на трёх экранах кода у тебя происходит.
    Имхо это очень опасно так вот делать огромную ставку на концепцию именно в таком стиле.

    #2
    13:43, 5 июня 2023

    =A=L=X=
    .Then() нужен для промисов, чтоб передавать ему входные данные. В С++20 это можно заменить корутинами, промисы автоматом конвертируются в корутину и возвращают значение.
    Но под андроид корутины еще не поддерживаются.

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

    #3
    13:58, 5 июня 2023

    /A\

    Мне именно что пришлось поработать с промисами в идиоме .then и это блевотина когда понять куда что, как и когда передалось по сравнению с однопоточной программой сложнее в 10-20 раз.
    Если не будет асинхронных функций которые эти сложности хорошо прячут под капот, то прям нехорошо.
    Можно будет запутываться просто в реализации нажатия кнопки на выход из игры когда будет промежуточный диалог YES/NO - это пипец, в концепции .then код начинает затмевать логику.

    #4
    14:11, 5 июня 2023

    =A=L=X=
    На корутинах другой код получается.

    ImageMemView mem_view = co_await ctx.ReadbackImage( image, ReadbackImageDesc{} );

    И промисы чаще всего с короткими цепочками:

    auto task = AsyncTask{ctx.ReadbackImage( image, ReadbackImageDesc{} )
      .Then( [](const ImageMemView &view) {
        })};
    
    // запустить таск после .Then()
    Scheduler().Run< OtherTask >(
       Tuple{},   // конструктор
       Tuple{task} ); // зависимость таска
    #5
    15:28, 5 июня 2023

    Еще сделана универсальная система ввода, клавиатура, мышь, джойстики, гироскопы все в коде видны как имя + данные.
    Биндинги в скриптах выглядят так:

    + Показать
    #6
    17:08, 5 июня 2023

    Исходники главное не пали, а то вдруг пацаны сп*дят и заработают на них миллионы баксов, а тебя оставят с носом.

    #7
    17:18, 5 июня 2023

    v1c
    > Исходники главное не пали
    На гихабе по моему имени 2.7к файлов, я думаю хватит пока что, потом еще выложу)

    #8
    17:46, 5 июня 2023

    Роннико похоже был прав.
    Тут байт текста кода больше, чем байт в картинке, которую он обрабатывает )

    #9
    17:54, 5 июня 2023

    раб вакуумной лампы
    В движке 9.5Мб кода написаного мной)
    Еще под 2Мб в демо и редакторе шейдеров.

    #10
    20:24, 5 июня 2023

    Асинхронная загрузка текстур у тебя есть? Я тут недавно сделал на вулкане подобную, у меня получилось 6 очередей (+ 7 вулкановская) и пять потоков.

    #11
    20:34, 5 июня 2023

    v1c
    > Асинхронная загрузка текстур у тебя есть?
    да

    > у меня получилось 6 очередей и пять потоков.
    Зачем? Можно в 1 поток и в 1 очередь.
    Асинхронное чтение из файла и по частям каждый кадр заливать, чтоб не блокировать PCI надолго.

    #12
    20:43, 5 июня 2023

    /A\
    Например если у юзера стоит старый HDD, то открытие файла включает позиционирование головки на секторе диска, а это медленно. В это время другой поток может аллоцировать текстуру или декомрессить текстуру из сжатого формата (Zlib, Basis Universal и т.д). Идея такая если что-то можем делать параллельно - делаем, а не ждём пока какая-то стадия освободит поток. Таким образом пак текстур может грузиться быстрее.

    #13
    21:00, 5 июня 2023

    v1c
    Но это уже детали, в твоем первом вопросе не было каких-то намеков на ЦП-нагрузку, а значит можно в одном потоке все сделать при использовании асинхронных команд, которые не блокируют ЦП на позиционирование головки в диске и тд.

    #14
    21:35, 5 июня 2023

    /A\
    У меня загрузка текстуры разбита на такие стадии:
    Setup -> Create -> Load -> Decompress -> Transfer Copy -> Submit
    Каждая стадия занимает какое-то время, поэтому я разбил их на потоке чтобы декомпрессор одной текстуры не ждал загрузку с диска другой.

    Страницы: 1 2 316 17 Следующая »
    ФлеймФорумПроЭкты