Профилирование графического рендеринга без профилировщика
В настоящее время у нас есть довольно продвинутые инструменты для сглаживания рендеринга, позволяющие видеть различные этапы, время, затрачиваемое на вызовы отрисовки и т. Д. Но без них графический конвейер становится черным ящиком, когда речь идет о том, что происходит внутри.
Предположим, по какой-то причине у вас нет такого инструмента или он очень ограничен. Как бы вы оценили, сколько времени занимает ваш рендеринг?
Мне известны такие приемы, как отбрасывание вызовов отрисовки, чтобы увидеть время процессора, установка окна просмотра 1x1 для просмотра стоимости геометрии, использование шейдера немого фрагмента для выделения скорости заполнения... Они уже полезны, но дают лишь приблизительное представление о том, что происходит и ничего не говорит об уровне параллелизма.
Кроме того, получение времени, затрачиваемого на каждый этап для каждого вызова, кажется трудным, особенно с учетом отсутствия точности из-за шума при измерении.
Какие приемы вы используете, когда ваш рюкзак почти пуст, и вам все еще нужно профилировать рендеринг? В чем состоит ваш личный швейцарский армейский нож?
2 ответа
Время рендеринга времени кадра
Абсолютное время, потраченное на небольшой код / этап / и т. Д. это не так важно, так как оптимизация / пакетирование / параллелизм / версия драйвера графического процессора делает практически невозможным точное измерение кода без счетчиков графического процессора. (который можно получить, если вы используете библиотеки libs)
То, что вы можете легко измерить, - это каждое влияние изменения кода Вы получите только относительное влияние, и это то, что вам действительно нужно в любом случае. И это только с использованием времени рендеринга кадров.
В идеале вы должны стремиться к тому, чтобы иметь возможность редактировать код шейдера или конвейера во время выполнения и иметь прямой способ проверить влияние на всю типичную сцену, например, просто сравнивая графики между несколькими путями кода. (остерегайтесь статических сцен, в противном случае вы получите высоко оптимизированные статические представления, но с низкой производительностью динамических сцен)
Вот список швейцарских армейских ножей:
- загрузчик состояний сцены
- рекордер сцены (пути камеры / добавления-удаления объектов, текстуры, сетки, фальшивый ввод и т. д.) с использованием состояний сцены.
- заставка состояния сцены
- регистратор времени кадра (не только окончательное среднее, но и время рендеринга каждого кадра)
- перезагрузка кода шейдера на лету
- переключатель кодепа на лету
- читатель журнала времени кадра + графики + статистическая структура
Обратите внимание, что загрузка / сохранение / запись состояния сцены удобны для многих других целей, от отладки до отмены / повтора и перезагрузки на лету, не говоря уже о сохранении игр. Добавьте скриншот taker + image diff, и вы также можете протестировать графический код.
Если можете, добавьте это на свой CI-сервер, чтобы огромное влияние кода не осталось незамеченным. (помогает также художникам, когда они регистрируют свои активы, не оценивая влияние рендеринга). Необходимо прочитать о том, что соответствующая графическая тестовая работа CI находится здесь: http://aras-p.info/blog/2011/06/17/testing-graphics-code-4-years-later/
Примечание: я отвечаю на вопрос: "Профилирование рендеринга графики с помощью профилировщика", поскольку это то, что я искал;)
Я работаю в основном на Mac, и я использую несколько инструментов:
- Версия gDebugger 5.8 доступна для Windows и Mac (этот инструмент был куплен AMD, версия v6 только для Windows). Он дает вам статистику об изменениях состояния, использовании текстур, вызовах отрисовки и т. Д. Он также полезен для отладки текстурного отображения и просмотра, как рисуется ваша сцена, шаг за шагом.
- PVRUniSCoEditor это редактор шейдеров. Он компилируется на лету и дает вам ценную информацию о предполагаемых циклах и использовании регистров.
- Инструменты (из XCode Utilities, только OSX), он получает информацию от драйвера OpenGL, замечательно найти узкое место, так как вы можете отследить, какая часть графического процессора используется на 100% (тайлер, рендер, текстурный модуль и т. Д.)
- Adreno Profiler - инструмент Windows для профилирования мобильных устройств на базе Adreno. (Очень хороший инструмент, если вы работаете над приложениями для Android;))
Какой трюк у вас с "шейдером немого фрагмента, чтобы выделить скорость заполнения"? (рисование простым цветом? или что-то более продвинутое?)