Пытливость ума и желание знать как все работает изнутри выделяет технаря из массы пользователей. В этом небольшом посте я бы хотел поделиться с любознательным сообществом небольшими роликами и кратким рецептом использования профилирующего софта для 3D приложений.



Дисклеймер
Я не 3D разработчик, не разрабатываю движки, игры и не моделирую. Это всего лишь хобби. Большой интерес к 3D у меня всегда был. И все познаю постепенно и самостоятельно. Если в тексте будут (а они будут) некоторые технические неточности — пишите в ЛС или комментарии. Я все поправлю и всегда не прочь хапануть фидбека для повышения опыта.
Сразу прошу прощения, если я запостил эту статью не в тот хаб. Скорее всего я так и сделал.
Но по-моему такой материал не достаточно мощный, что бы попасть в раздел «Разработка» или «Отладка»

Посмотреть видео, а потом почитаем
Итак, если мы хотим оценить как происходит подготовка игрового кадра. Какая геометрия, текстуры, сколько вызовов на отрисовку, где возникает просадка в производительности? Можно воспользоваться специализированным софтом для отладки этих процессов.

Я перечислю основные из них:

  1. RenderDoc
  2. Nvidia Nsight
  3. GPUperfStudio

RenderDoc — графический отладчик от Crytek.



(На скриншоте бюст Лары Крофт из последней части: Rise of the Tomb Rider)

Поддержка DirectX 11/12, Vulkan, OpenGL 3.2+



Это opensource проект. Регулярно подкрепляется свежими коммитами.

> Ссылка на репозиторий и документацию

Интерфейс достаточно гибкий и интуитивно прост. Пытливой душе не составит труда за 5 минут разобраться как запустить какую-нибудь игру или приложение и пройтись по всему процессу отрисовки. Сторонних приложений для старта не нужно.

Указываем путь к exe, дополнительные параметры и запускаем. Далее в приложении в нужный момент нажимаем F12 или PrintScrn, RenderDoc сохраняет кадр, который можно сохранить, и возвращаться к нему даже без запускания игры или поделиться им с напарником.

Еще, например, можно экспортировать геометрию и текстуры.



Nvidia Nsight — инструмент отладки от NVIDIA.


Большой и весьма мощный инструмент отладчика. Это не единственный инструмент в арсенале Nvidia. Есть инструменты для мобильных приложений, Linux, Mac устройств и тд. Во всем их многообразии я не разбирался. Nsight предполагает совместное использование с Visual Studio, но для быстрого старта можно попробовать без установленого IDE от Microsoft.

Бесплатно регистрируемся в Nvidia Developer Program и преспокойно скачиваем необоходимые инструменты. На сайте Nvidia есть документация и разъясняющие видео по использованию инструментов.

Для запуска, достаточно перетянуть ярлык приложения на ярлык Nvidia Nsight. И, если все верно, вы увидете HUD'ы и графики от Nsight.

Делается кадр просто: нажимаем CTRL+Z, после этого жмем пробел или кнопку со значком лупы. Процесс останавливается, и открывается окно Nsight Replay, внизу которого есть таймлайн с ползунком. В Nsight есть подсказки и интерфейс достаточно прост. Так же есть возможность сохранить всю отрисовку кадра в файл, но для его открытия придется таки установить Visual Studio.



Что бы поглубже залезть в процесс, необходимо все манипуляции производить из VS. Либо запускать 3D приложение из VS, либо запускать сохраненный кадр (функция сохранения доступа и без установленой VS)

Создадим пустой проект:



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



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



Процесс такой же как я описывал выше по тексту. Но теперь в VS открываются дополнительные возможности отладки, коих нету при отладке без VS. И геометрия и текстуры, и шейдеры. Анализировать процессы можно с разных сторон.



Так же у Nsight есть полезная киллер-фича: можно запустить приложение с сервером на выделеной машине, а из VS подключаться к ней. Так каждому не требуется разворачивать одинаковое окружение с приложением, что упрощает жизнь разработчика или команды разработчиков.

Для работы с сохраненными кадрами достаточно открыть сохраненный проект под свою версию Visual Studio, скомпилировать релизный билд и включить Nsight отладку. Далее все как описано выше.

Кстати. Не разобрался можно ли в Nsight разглядывать всю геометрию прогона, как это сделано в RenderDoc? Очень удобно при отображении конкретного вызова отрисовки с сетками из предшествующих вызовов.

Плюс я не смог проверить работу софта на видеокарте от AMD, за неимением последней. Но вроде бы у Nvidia в этом вопросе нету жестких требований.

GPU PerfStudio — разработка Advanced Micro Devices (AMD)


Прекрасный и мощный инструмент. Так же имеет вомзожность удаленной отладки.

> Ссылка на скачивание и докумнетацию



В использовании прост. Имеется 2 версии сервера (64 и 32 бита) для запуска достаточно просто перетянуть необходимое приложение на сервер. О чем он и сам попросит, когда вы его попытаетесь запустить.



Далее просто включаем клиент. Подключаемся к серверу, в нужный момент делаем паузу и теперь можем заниматься всем тем, чем занимались до этого в RenderDoc или Nvidia Nsight.

Широкая поддержка различных API и устройств. Не смотря на происхождение, поддерживает мою видеокарту от Nvidia. Так что никаких заговоров и палок в колеса…

UPD В комментариях подсказали еще один инструмент с открытым исходным кодом.
apitrace
Мультиплатформенный и поддерживающий различные API. Я его еще не щупал, но по словам lieff полезный и простой инструмент.



Какой инструмент лучше из них я сказать не могу. У каждого есть некоторые свои мини фичи, таблицы, графики, в которых может содержаться очень нужная в конкретной задаче информация. С пользовательской стороны, человека любопытного, мне как-то больше «сложилось» с RenderDoc. Но иногда не все процессы получается в нем запустить.

И кстати о запуске процессов. Все очень легко и просто когда у вас есть приложение А и инструмент Б. Тогда инструмент Б запускает приложение А и все довольны. Но если в этой схеме есть посредники: лаунчеры, античит софт и прочие обертки, то тут приходится немного «потанцевать».

Рассмотрим пример запуска игры из Steam или Origin и прочих сервисов.

В этом случае нужно придерживаться определенного порядка действий в любом инструментарии:

  1. Отключаем всевозможные оверлеи In-Game фичи в Steam, Origin, Uplay и тд.
  2. Перед запуском эти приложения должны быть выключены.
  3. Запускать необходимо не файл игры, а обертку (Steam, Origin, Uplay и тд.)
  4. После этого можно запускать игру прямо из запущеной «обертки»
  5. Зачастую необходимы дополнительные параметры запуска. Например для Watch Dogs 2 параметр -eac_launcher, что бы отключить античит. Тут нужно читать ридми, конфиги на предмет подсказки. Плюс дополнительные параметры помогают ускорить процесс запуска приложения. Пример для Steam: -applaunch 99999 (id приложения)
  6. Всегда проверяйте версию API в приложении. Возможно в настройках включен DX12, а он у вас не поддерживается и тд. Делайте преднастройки, закрывайте игру, а уже потом запускаем отладку.
  7. Некоторые приложения не стабильны на мультиграфических системах (например: встроенное видео + дискретная карта). Отключайте лишнее в диспетчере устройств. Плюс в таком случае лучше дебажить снимок кадра, а не запущеную игру. Т.к. замучаетесь перезапускать при обвалах.



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

Battlefield 1


GTA V


Rise of Tomb Rider


Witcher 3


Watch Dogs 2


А на этом все. Надеюсь этот материал впечатлит, подскажет, поможет или еще каким-либо положительным образом скажется на читающем его. Правки, советы, благодарности и пинки присылайте в ЛС или комментарии.

И на последок хотелось бы немного попиарить свой Youtube канал: www.youtube.com/КакойтоАйтишник
Это, конечно, дурной тон для гиктаймса, но все эти социальные штуковины: подписки, лайки и комментарии, повышают мотивацию к выпуску нового и более качественного контента.
Поделиться с друзьями
-->

Комментарии (22)


  1. Aquahawk
    26.01.2017 16:20
    +1

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


    1. igentuman
      26.01.2017 17:17

      Ну миссия, можно считать, выполнена. Как минимум одному человеку контент понравился))


  1. lieff
    26.01.2017 16:55
    +3

    Я бы еще упоминание apitrace добавил. Не раз выручал меня, несмотря на наличие навороченных отладчиков.


    1. igentuman
      26.01.2017 17:16

      Спасибо. Включил в текстовку


      1. lieff
        26.01.2017 17:29

        Только это не совсем отладчик) Он трейсит все графические вызовы в файл. Позже этот файл можно проиграть, перевести в разные форматы включая текст, или открыть gui утилитой для изучения. Прелесть в том, что можно например изменить сорс плеера и вставить например printf() именно в том вызове где надо. Или в тексте можно быстро грепнуть нужные gl вызовы. Можно выдрать нужные вызовы\буфера и вставить их в код.


        1. igentuman
          26.01.2017 17:45

          Подкорректировал этот момент


    1. iOrange
      26.01.2017 21:27
      +1

      apitrace отличный инструмент! Перешел на него с glIntercept.


  1. badcatz
    26.01.2017 21:22
    +1

    очень занимательно… спасибо


  1. Inobelar
    26.01.2017 22:02
    +3

    О watch dogs 2 наглядное видео об оптимизации: рендерятся скалы за домом, который почти весь за холмом! :D /irony


    1. igentuman
      26.01.2017 22:32

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


  1. vkegdzoy
    26.01.2017 23:46
    +2

    Действительно огромная работа, очень интересно.
    Когда в ведьмаке рендерится освещение, зачем нужны все эти сетки на небе, в иглу уменьшенные кадры? Чем это отличается от того же гта?
    Если остановится на этапе отрисовки моделей, не переходя к освещению, это намного увеличит производительность игры?


    1. igentuman
      27.01.2017 00:01

      Спасибо. В Ведьмаке очень интересный процесс. Мне вот интересно зачем вначале столько геометрии просчитывается, причем даже если ты в закрытом помещении находишься.
      Сетки на небе это небесный купол, облака, птички и тд. Сейчас я подробностей не вспомню.
      Посмотреть сколько можно выграть по времени можно в отладке. Там есть затраченое время: CPU time, GPU time на каждом событии. Есть диаграммы эффективности использования ресурсов. Подробную аналитику по некоторым игровым тайтлам я планирую проводить после того как соберу больше информации и знаний. И лучше изучу инструменты отладки.


  1. brick_btv
    27.01.2017 15:48

    До момента просчёта освещения — все игры похожи на GTA San Andreas.
    До момента наложения светофильтров — все игры похожи друг на друга =)


  1. maaGames
    27.01.2017 17:12
    +1

    Watch Dogs выглядит безумием, конечно. Но, совершенно очевидно, что там drawing calls упорядочены по текстурам. Т.е. если выполнить сортировку объектов/треугольников и рисовать от ближних к дальним, то перерисовок каждого пиксела будет меньше, но и текстуры переключать придётся гораздо чаще. Видимо, гораздо дешевле отрисовывать далёкие скрытые объекты, которые не будет потом видно (на примере скал, скрытых под асфальтом), чем гораздо чаще переключать текстуры.
    Из своего, небольшого, опыта программирования 3D игр могу лишь вспомнить, что я сперва вычислял освещение с формированием Z-буфера, а уже потом выполнял текстурирование с выборкой только тех текстур, пиксели которых не отваливались по Z-буферу. Но у меня шейдер освещённости простой был. Возможно, сейчас дешевле текстурировать, чем сложное освещение считать.


    1. igentuman
      27.01.2017 20:26

      Спасибо. Любопытно. Значит надо смотреть как часто меняется Render State?


      1. maaGames
        28.01.2017 06:40
        +1

        Да, для эффективности используют batching и там уже возможности упорядочивания по глубине ограничены (только в пределах одного шейдера и заданных текстур и камеры), если вообще есть смысл тратить время на сортировку. Вообще, я ожидаю увидеть группировку по шейдерам, затем по текстурам, затем уже сортировку по глубине. На примере watch dogs, тексутра скал оказалась самой первой, поэтому сперва нарисовались все скалы, а потом их перекрыло всеми другими объектами. Возможно, там есть какая-то сортировка объектов и рисуется от ближних к дальним, но исходя из текстуры самого близкого объекта. Т.е. кусочек скалы оказался ближе всего к камере, поэтому принято решение начать рисовать скалы, но почти все скалы оказались на горизонте, за исключением малюсенького торчащего камушка у камеры… Это пусть и не очень удачная, но хотя бы логика. А если они в «случайном» порядке объекты рисуют, то там громадные возможности для оптимизации видятся.


        1. KpoKec
          29.01.2017 20:45

          А может модель скал единая — поэтому не получается отрезать конкретную часть. Так что тут может быть и неверно организованная модель.


          1. maaGames
            30.01.2017 14:06

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


  1. Jofr
    30.01.2017 16:09

    Я, пожалуй, затребую отдельную статью с разбором ведьмака. Если по остальным таймлапсам у меня вопросов не возникло, то тут я весь ролик только и делал, что голосил: «Что? Что это? Что они делают? А это что? Что происходит вообще???». В общем. дюже интересно :)


    1. igentuman
      30.01.2017 20:21

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


  1. d1zz3l
    03.02.2017 10:01

    мне показалось или Геральт отрисовывался два раза в одной и той же сцене? И еще почему бы не отрисовывать все то что не видит игрок? Какая-то часть обектов мне не видна потому что стоит ко мне одним боком…


    1. igentuman
      03.02.2017 10:02

      Хороший вопрос, я бы такой задал разработчикам из CD Projekt Red.))