company_banner

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

    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

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

    После запуска приложения на мобильном устройстве вы увидите следующий экран.

    image

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

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

    Также вы можете совместить два и более графиков на одном (полезно при мониторинге взаимосвязанных метрик) если будете удерживать клавишу 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

    На этом часть, посвященная GPA System Analyzer, заканчивается. Надеюсь полученная информация поможет вам быстро освоить этот инструмент и на практике применить полученные знания.

    В следующий раз я расскажу об инструменте под названием GPA Frame Debugger, который позволяет проводить детальный анализ OpenGL сцен в простой и наглядной форме.
    • +19
    • 7,5k
    • 1
    Intel
    186,00
    Компания
    Поделиться публикацией

    Похожие публикации

    Комментарии 1

      +2
      Слушал доклад Дмитрия на droidcon по этому инструменту. Довольно интересная штука.

      p.s. отдельное спасибо за включение компилятора в состав INDE.

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое