воскресенье, 26 мая 2024 г.

devlog hrtp-demake: Optick и небольшое профилирование.

 


Вот как-то так Optick у меня и выглядел на одной из итераций профилирования

    Недавно решил побороться с производительностью своего пет-проекта - hrtp-demake, и пришёл к выводу, что мне нужен нормальный, заточенный под это профилировщик в движке. В своё время я больше возился с Very Sleepy и это ок, но, увы, семплирующий профилировщик не может показывать, что там жрёт время в кадре, а в семнадцатую студию ничего хорошего под это не завезли. В новой вроде бы должна быть какая-то поддержка flamegraph-визуализаций, но я не смотрел, и перелазить туда мне пока неохота.
    
    Выбор пал на Optick. Сейчас он выглядит довольно заброшенным, но данный инструмент, всё же рабочий. А кроме того, у него был плагин под анрил, что, согласитесь, уже круто.
    
    Но я как-то застрял на том, что вот, надо вставлять определённый макрос в начало любой процедуры и функции, и это же займёт миллиард лет, если делать вручную. Второй подход к этому снаряду включал влезание в LLVM и попытку аннотирования кода в процессе разбора. Но, оказалось, что в моём случае всё может быть проще. Тут помог тупо стиль кодирования - у меня всё же, чаще всего, в cpp-файлах  нет никаких объявлений пространств имён, структур и классов, а значит - если есть открывающая фигурная скобка в начале строки, то можно сразу пихать туда макрос. Ну а хедеры всё же у меня тоже всегда в начале файла, и это облегчало задачу. В итоге я наколхозил нехитрый хедер  и скрипт, где можно было добавить файлы для исключения из обработки. На удивление это сработало довольно шустро, и в движок, и в игру я добавил полную поддержку за менее чем 2 часа, что просто кайф. Минус такого подхода очевиден: каждый кадр, в силу логирования всего на свете кушает прилично памяти, поэтому долго держать игру запущенной на слабой машине просто нельзя, иначе вся память очень быстро будет съедена.

   Ещё из особенностей: сразу же я узнал, что прекомпилированного Optick под x32 не существует, но, впрочем, его можно собрать из исходников, и это даже работает. Но тестировать x64 всё равно пришлось по причинам, о которых я напишу ниже.

      Беглый просмотр на довольно мощной машине показал, что glSwapBuffers, кушал многовато времени, что есть следствие VSync. Но вот на дохловатом ноуте с Pentium N3710 и интегрированной видяхой, картина была кардинально другой (я, правда, пару раз словил падения при снятии трейса, но оно того стоило). Обнаружились боттлнеки в анимациях, обработке некоторых моментов в картах и много чего другого. Сначала захотелось устроить жёсткую многопоточность, но, честно говоря, не потребовалось:  размазывание по кадрам сделало свою работу, и я в сложных случаях получил около х2-x3 по FPS. На боссфайте на этом ноуте всё равно немного проседает ниже 60, но слайд-шоу нет, и тем более, за один день - это достойный результат. Почему я всё же не сделал многопоточность в этих местах? Потому что, хотелось просто выжать максимум перед тем, как всё же пилить потоки. Думаю, что это всё равно потребуется в будущем, но пока я счёл результат достаточным.

    Параллельно мне захотелось убедиться, что я правильно понимаю, что игруля упирается иногда в VSync. Но для этого нужен - правильно, профилировщик для OpenGL. И с этим довольно туго - большая часть профилировщиков мертва, но я нашёл, что вроде бы как Nsight Graphics умеет считать метрики для core profile. У меня, правда, compatibility, но я не особо много юзаю слой совместимости (в планах всё же переход на core). Поэтому я смело сел его качать и разбираться. Сначала я узнал, что x32 приложения в нём отправляются в причинное место. Ну что ж, х64, так x64, пересборка, проверка - и тут я узнал, что мой 1050Ti не может быть использован со свежим Nsight. Это очень смешно, потому что я решительно не понимаю, зачем мне профилировать на мощных современных GPU, которые подвесить могут только особо умные 3D-артисты, когда я знаю, что тормозить будет на куда более слабой машине, и там бы хотелось узнать,  что же мешает. Поплевав и вспомнив высказывания Линуса Торвальдся об NVidia, я начал ковырять дальше. Но далеко лезть не пришлось - оказалось, что в какой-то версии такая поддержка была дропнута (и поэтому в 2024.1 не работает), а вот в 2022.1 моя видеокарта поддерживается. И ЧСХ, завелось, я узнал, что там всё это занимает менее 1 мс (и правильно, там ничего адового ни в геометрии, ни в шейдерах не было) и успокоился. Но, блин, вот этот момент немного злит, потому что еле-еле нашёл нужную версию. А вот так дропать саппорт видеокарте, которой едва-едва 8 лет - ну это странно.

       В общем, несмотря на проблемы, улучшениями в производительности я доволен. Думаю, что в будущем это мне ещё успеет помочь, хоть и стоит слезть с OGL, и, может ещё поискать какие-то другие профилировщики.

Комментариев нет:

Отправить комментарий