лёд тронулся, господа присяжные заседатели! |
Jun. 15th, 2019|12:04 am |
всё-таки пересилил себя и начал пилить подсистему профилирования. давно надо было, но ужасно неохота же: нудно это. пока уговаривал себя начать — починил кучку багов и спланировал план запила новой подсистемы полиобъектов. полезно, конечно, но профайлеры сами себя не напишут.
почему не воспользоваться внешним инструментом, и не парить мозг? потому что неудобно и не всегда доступно. кроме того, что я хочу красивые графички в рилтайме, мне нужны профили в виде удобного для обработки файла на диске, иерархическая структура счётчиков, выборочное включение/выключение любого из них (с автоматической обработкой детей), и прочие мелкие приятности. и да — внешний инструмент не всегда доступен; это можно и два раза повторить. обычный игрок не будет париться установкой девтулзов и пересборкой игры с другими флагами, если я попрошу его сделать профиль, чтобы понять, почему у него игра тормозит.
сделал в виде большого кольцевого буфера, куда профайлеры пишут инфу. манагер профайлеров разруливает регистрацию, назначение каждому порядкого номера в буфере и так далее. дёшево, сердито, не надо в начале кадра бегать циклом по всем профайлерам и просить их переинититься, а в конце бегать и собирать с каждого данные.
при запуске ребёнка автоматически запускаются все родители, при стопе ребёнка родители стопятся. конечно, поддерживается рекурсивный старт/стоп, так что если родитель до запуска ребёнка был активен — то и останется активен. таким образом каждый родитель собирает совокупное время работы всех детей, а корневой профилер — время всего кадра.
кольцевой буфер можно тупо кидать в файл, когда номер следующего элемента врапнется, прямо как есть. ну, будет игра иногда заикаться, если запись в файл включена. потом сделаю для этого отдельный поток, пусть он пишет. на профиле это всё равно не скажется.
оверхэд на активирование/деактивирование профилера — один поход по указателю и одно условие, если профилинг неактивен. нормально, меня устраивает: это далеко не самый тормозной код в движке.
алсо, надо бы выложить очередной вендобилд перед Началом Великого Внедрежа. |
|