Intel GPA для Android — оптимизируем графику в мобильных приложениях
В продолжение серии статей, посвященных Intel INDE, хочу рассказать об уникальном (не побоюсь этого слова) инструменте для разработчиков, созданном компанией Intel — Intel GPA (Graphics Performance Analyzers). Я уже упоминал его в обзорной статье, посвященной Intel INDE.В состав Intel GPA входят средства, позволяющие анализировать производительность, находить узкие места, оптимизировать работу приложений. При этом инструменты имеют интуитивно понятный, удобный графический интерфейс, что дает разработчикам возможность стартовать «с места в карьер», даже не обладая большим опытом в оптимизации и отладке графических приложений.Intel GPA поддерживает анализ производительности приложений для Windows и Android. Версия для Windows (DirectX) существует на рынке давно, о ней написано много статей; версия же для Android, предназначенная для приложений, использующих OpenGL, появилась сравнительно недавно, и многие разработчики даже не подозревают о ее существовании. Этот пробел я и собираюсь восполнить.Системные требованияIntel GPA доступен для следующих ОСWindows 7, 8, 8.1
OS X
Ubuntu
Мобильное устройство
Также потребуется Android устройство на базе Intel Atom, связано это с тем, что анализ приложения выполняется прямо на устройстве, при этом не потребуется рутовать или как-то подготавливать устройство, единственное требование: устройство должно определяться ADB (Android Debug Bridge).Приложение
Профилируемое приложение должно иметь в манифесте флаг debuggable=«true»
С домашней страницы Intel GPA Открываем домашнюю страницу Intel GPA, выбираем пакет для вашей ОС, скачиваем, устанавливаем.Что внутри Вместе с GPA System Analyzer будут установлены GPA Perfomance Analyzers и GPA Frame Analyzer. Все инструменты в пакете заслуживают отдельного внимания, дабы не перегружать статью информацией о всех трех в этот раз я расскажу о GPA System Analyzer.Начало работы Сначала необходимо подключить к хосту устройство и убедиться, что оно отображается в списке ADBВ командной строке
adb devices GPA System Analyzer Этот инструмент позволяет анализировать производительность приложений, находить потенциально узкие места, снимать метрики для более детального анализа. Отображает различные характеристики производительности мобильной платформы такие как: Состояние CPU Память Энергопотребление Сетевая, дисковая активность Метрики GPU Метрики OpenGL ES API Энергопотребление GPA System Analyzer позволяет «играть» с различными параметрами рендеринга, без внесения изменений в код. При этом результат можно сразу увидеть на экране мобильного устройства и наблюдать на графиках (загрузка CPU, GPU, FPS), как это отражается на производительности. Помимо этого, инструмент позволяет собирать данные о производительности, текущем кадре, которые могут быть более детально проанализированы с помощью GPA Performance Analyzers и GPA Frame Analyzer.
Итак запускаем GPA System Analyzer. После запуска должен отобразиться список доступных устройств:
Если устройство определяется ADB, но в списке отсутствует — попробуйте вручную указать путь к ADB. Для этого нажмите Ctrl+F1 и введите путь к папке с ADB.
После подключения к устройству вы увидите список установленных на устройстве приложений:
Для запуска и начала анализа приложения просто кликните по его названию в списке.
После запуска приложения на мобильном устройстве вы увидите следующий экран. В столбце слева отображаются различные метрики (Metrics) и опции рендеринга State Overrides. В правой части расположены графики, отображающие метрики производительности (в данном случае загрузка CPU анализируемым приложением и FPS).
Для добавления графика выбранного показателя производительности просто перетащите строку с его названием в область графиков.
Также вы можете совместить два и более графиков на одном (полезно при мониторинге взаимосвязанных метрик) если будете удерживать клавишу Ctrl при перемещении метрики в область графиков:
Метрики CPU Aggregated CPU Load — общая загрузка CPU CPU 0x Load — загрузка каждого ядра CPU 0x Frequency — текущая частота каждого из ядер Target App CPU Load — загрузка CPU профилируемым приложением Device IO Метрики, перечисленные ниже, учитывают операции чтения-записи всеми приложениями на устройстве, без привязки к профилируемому приложению.Disk Read — скорость операций чтения данных с накопителя (внутренняя память или SD карта). Disk Write — скорость записи на накопитель. Network RX — скорость получения данных из сети (включая все сетевые интерфейсы, кроме loopback) Network TX — скорость передачи данных GPU GPU Frequency — частота работы GPU в процессе мониторинга TA Load — загрузка Tile Accelerator, в процентном соотношении PB Primitives/Second — количество графических примитивов, загруженных в Parameter Buffer PB Vertices/Second — количество вершин, загруженных в Parameter Buffer PB Vertices/Primitive — количество вершин на примитив, сводный параметр, указывающий на эффективность процесса построения примитивов ISP Load — время, затрачиваемое Image Synthesis Processor на отсечение невидимых поверхностей, в процентах TSP Load — время, которое Texture Shading Processor тратит на текстурирование видимых фрагментов, в процентах USSE Vertex Load — время, которое Universal Scalable Shader Engine занят обсчетом вершин, в процентах USSE Pixel Load — время, которое USSE тратит на обработку пикселов USSE Total Load — время, которое USSE тратит на выполнение инструкций USSE Vertices/Second — количество вершин обработанных USSE, в секунду Memory App Resident Memory — объем памяти (RAM), занятой анализируемым приложением Available Memory — объем памяти мобильного устройства, доступный приложению OpenGL Buffer Creations — количество буферов, созданных приложением, на один кадр Draw Calls — количество вызовов функция рисования, на один кадр Indexed Draw Calls — тоже что и Draw Calls, но для проиндексированных примитивов Vertex Count — количество вершин, участвовавших в отрисовке сцены, на один кадр Indexed Vertex Count — тоже что и Vertex Count, но для проиндексированных вершин FPS — количество кадров в секунду Frame Time — время отрисовки одного кадра Frame Number — номер текущего кадра RT Clears — сколько раз был вызван glClear для Render Target на один кадр Error Gets — количество вызовов glGetError на один кадр Total State Changes — суммарное изменение состояний Open GL за один кадр Bind Texture Calls — количество вызовов glBindTexture на один кадр Bind Buffer Calls — количество вызовов glBindBuffer на один кадр Use Program Calls — количество вызовов glUseProgram на один кадр Power Battery Voltage — текущий вольтаж батареи Current Charging — показывает, сколько миллиампер потребляется устройством через USB для зарядки батареи Current Discharging — сколько миллиампер потребляется мобильным устройством от батареи Power Charging — количество Ватт, потребляемых батареей Power Discharging — количество Ватт, потребляемых устройством Поиск проблем и способов улучшения производительности с помощью метрик Как вы видите, GPA System Analyzer помогает мониторить практически любые показатели, отражающие производительность приложения. Но не все метрики напрямую могут указать на проблемы (как в случае с загрузкой CPU — чем выше, тем хуже), часть из них расскажет что-то полезное, только при сопоставлении с другими.Метрики производительности GPU TA Load и USSE Vertex Load В идеале оба показателя должны быть сбалансированными, что позволяет достичь лучшей производительности.TA Load высокий, USSE Vertex Load низкий — сцена содержит слишком много вершин, можно улучшить производительность путем упрощения объектов.
TA Load низкий, USSE Vertex Load высокий — слишком сложный вершинный шейдер, есть место для оптимизации кода шейдера.
PB Primitives/Second Слишком высокий показатель указывает на то, что скорее всего проблема в размере формата вершины.PB Vertices/Second Высокий показатель может указывать на большой объем данных, передаваемых между вершинным и фрагментным шейдерами.PB Vertices/Primitive Высокий показатель указывает на возможность оптимизации за счет уменьшение количества вершин в моделях, например через их переиспользование с помощью индексного буфера.ISP Load Высокий показатель может быть в тех случаях, когда один Z-буфер используется с несколькими Render Target. Чтобы улучшить ситуацию, можно создать собственный буфер для каждого RT.TSP Load, Texture Unit Load, USSE Pixel Load Высокий TSP Load указывает на возможность улучшения производительности за счет оптимизации шейдеров (высокая загрузка USSE Pixel Load) или текстур (высокая загрузка Texture Unit) путем уменьшения разрешения, использования сжатия.USSE Total Load, USSE Vertex Load, USSE Pixel Load Высокий USSE Total Load указывает на возможность повышения производительности за счет оптимизации работы вершинного (высокий показатель USSE Vertex Load) или фрагментного (USSE Pixel Load) шейдеров.Метрики OpenGL Draw Calls & Indexed Draw Calls С точки зрения производительности вызов функций рисования является затратной операцией. Высокие показатели данных метрик могут указывать на возможности повышения производительности путем группировки вершин и отрисовки одним вызовом.Buffer Creations Выделение буфера является затратной операцией, в идеале должно происходить где-то на этапе инициализации сцены. Появление этого показателя на графике говорит о том, что у вас есть возможность повысить эффективность кода путем перенесения кода, создающего буферы в инициализацию, загрузку сцены.Error Gets Вызовы glGetError ухудшают производительность. В финальной версии вашего приложения этот показатель должен равняться нулю.State Overrides Еще одним интересным инструментом является возможность переопределение состояний анализируемого приложения без внесения изменений в код. По сути это различные эксперименты, которые вы можете ставить над своим приложением, чтобы понять, как включение тех или иных параметров влияет на производительность приложения.Disable All Отключает все активные опции. Отображает активную сцену как есть.
1×1 Scissor Rect Отключает обработку пикселов в графическом пайплайне. Если при включенной опции FPS не изменяется то скорее всего проблема в слишком сложной геометрии сцены или вертексном шейдере.(в данном случае будет отображаться пустая сцена)
Disable Alpha Blending Отключает Alpha Blending. Операции, связанные с прозрачностью, могут серьезно влиять на производительность. Этот эксперимент покажет вам, как отключение блендинга сказывается на FPS.
Disable Draw Calls Игнорирует функции рисования. Данный эксперимент поможет понять, как будет вести себя ваше приложение на устройстве с бесконечно быстрым графическим чипом.Disable Z-Test Z буфер используется для обрезки объектов, расположенных полностью или частично за другими объектами на сцене. Включение этой опции должно сильно «затормозить» рисование сцены. Если этого не происходит, то у вас есть возможность улучшить производительность за счет сортировки объектов от близких к дальним перед их отрисовкой.Show Wireframe Включает режим отображения wireframe, позволяет визуально оценить порядок расположения объектов, сложность моделей.
Simple Fragment Shader Заменяет фрагментный шейдер на простой, одноцветный. Если при включении этой опции производительность улучшилась — попробуйте оптимизировать код фрагментного шейдера.
Texture 2×2 Заменяет используемые текстуры на более простые. Если при включении этой опции вы видите улучшение производительности — есть способ оптимизировать приложение за счет оптимизации текстур (уменьшение разрешения, использование сжатия).