Intel GPA для Android — оптимизируем графику в мобильных приложениях

в 6:39, , рубрики: Без рубрики

image В продолжение серии статей, посвященных 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”

<application android:debuggable=”true” … />

И разрешение android.permission.INTERNET

<uses-permission android:name="android.permission.INTERNET" />

Установка Intel GPA

Существует два способа установить Intel GPA:

В составе Intel INDE

Заходим на сайт Intel INDE, скачиваем и устанавливаем менеджер пакетов (об этом более подробно в обзорной статье про Intel INDE).

Выбираем GPA System Analyzer, кликаем Download, ожидаем окончания загрузки и устанавливаем.

С домашней страницы Intel GPA

Открываем домашнюю страницу Intel GPA, выбираем пакет для вашей ОС, скачиваем, устанавливаем.

Что внутри

Вместе с GPA System Analyzer будут установлены GPA Perfomance Analyzers и GPA Frame Analyzer. Все инструменты в пакете заслуживают отдельного внимания, дабы не перегружать статью информацией о всех трех в этот раз я расскажу о GPA System Analyzer.

Начало работы

Сначала необходимо подключить к хосту устройство и убедиться, что оно отображается в списке ADB

В командной строке

adb devices

image

GPA System Analyzer

Этот инструмент позволяет анализировать производительность приложений, находить потенциально узкие места, снимать метрики для более детального анализа. Отображает различные характеристики производительности мобильной платформы такие как:

  • Состояние CPU
  • Память
  • Энергопотребление
  • Сетевая, дисковая активность
  • Метрики GPU
  • Метрики OpenGL ES API
  • Энергопотребление

GPA System Analyzer позволяет «играть» с различными параметрами рендеринга, без внесения изменений в код. При этом результат можно сразу увидеть на экране мобильного устройства и наблюдать на графиках (загрузка CPU, GPU, FPS), как это отражается на производительности. Помимо этого, инструмент позволяет собирать данные о производительности, текущем кадре, которые могут быть более детально проанализированы с помощью GPA Performance Analyzers и GPA Frame Analyzer.

Итак запускаем GPA System Analyzer. После запуска должен отобразиться список доступных устройств:

image

Если устройство определяется ADB, но в списке отсутствует – попробуйте вручную указать путь к ADB. Для этого нажмите Ctrl+F1 и введите путь к папке с ADB.

image

После подключения к устройству вы увидите список установленных на устройстве приложений:

image

Для запуска и начала анализа приложения просто кликните по его названию в списке.

После запуска приложения на мобильном устройстве вы увидите следующий экран. В столбце слева отображаются различные метрики (Metrics) и опции рендеринга State Overrides. В правой части расположены графики, отображающие метрики производительности (в данном случае загрузка CPU анализируемым приложением и FPS).

Для добавления графика выбранного показателя производительности просто перетащите строку с его названием в область графиков.

image

Также вы можете совместить два и более графиков на одном (полезно при мониторинге взаимосвязанных метрик) если будете удерживать клавишу Ctrl при перемещении метрики в область графиков:

image

Метрики

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

Отключает все активные опции. Отображает активную сцену как есть.

image

1x1 Scissor Rect

Отключает обработку пикселов в графическом пайплайне. Если при включенной опции FPS не изменяется то скорее всего проблема в слишком сложной геометрии сцены или вертексном шейдере.

image
(в данном случае будет отображаться пустая сцена)

Disable Alpha Blending

Отключает Alpha Blending. Операции, связанные с прозрачностью, могут серьезно влиять на производительность. Этот эксперимент покажет вам, как отключение блендинга сказывается на FPS.

image

Disable Draw Calls

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

Disable Z-Test

Z буфер используется для обрезки объектов, расположенных полностью или частично за другими объектами на сцене. Включение этой опции должно сильно «затормозить» рисование сцены. Если этого не происходит, то у вас есть возможность улучшить производительность за счет сортировки объектов от близких к дальним перед их отрисовкой.

Show Wireframe

Включает режим отображения wireframe, позволяет визуально оценить порядок расположения объектов, сложность моделей.

image

Simple Fragment Shader

Заменяет фрагментный шейдер на простой, одноцветный. Если при включении этой опции производительность улучшилась – попробуйте оптимизировать код фрагментного шейдера.

image

Texture 2x2

Заменяет используемые текстуры на более простые. Если при включении этой опции вы видите улучшение производительности – есть способ оптимизировать приложение за счет оптимизации текстур (уменьшение разрешения, использование сжатия).

image

Автор: Terror

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js