Инструменты Intel для оптимизации и отладки Android-приложений
Intel GPA Frame Analyzer делает несколько попыток проиграть фрейм и показывает усредненную длительность Эргов и степень разброса (девиацию) измерений относительно среднего значения.
Разработчик может выделять индивидуальные элементы фрейма. Intel GPA Frame Analyzer при этом выполняет подсветку выбранных элементов в режимах закраски цветом (highlighted) или подсвеченной геометрии (highlighted wireframe). Таким образом, довольно легко определить, какие Эрги отвечают за тот или иной компонент финальной картины (Рис. 3.15). Для любого выбранного Эрга Intel GPA Frame Analyzer позволяет инспектировать текстуры и поверхности вывода с указанием частоты использования текстуры. Еще одним важным элементом предлагаемым пользователю, является доступ к вершинным и пиксельным шейдерам на уровне исходных кодов (на языке High Level Shader Language – HLSL) и ассемблера (Рис. 3.16).
Выбрав указанные Эрги, разработчик может провести над ними эксперименты. Например, можно переключить пиксельный шейдер на простой (Simple Pixel Shader), применить отсечение (1x1 Scissor Rect), выполнить замену текстур (2x2 Textures). Применяя эксперименты вместе или по отдельности, разработчик наблюдает, как изменяется высота Эргов на гистограмме, и видит в панели Scene Overview старое значение длительности выполнения Эрга (Old), новое значение (New), численную разницу (Delta) и дисперсию (Variance) (Рис. 3.17).
Набор отладочных средств Intel GPA Frame Analyzer включает просмотр метрик для всего фрейма в целом (Frame Overview), просмотр состояний DirectX (States), просмотр шейдеров и шейдерных констант (Shaders), просмотр текстур (Texture), лог вызовов DirectX (API Log) и другие.
Intel GPA Platform Analyzer.
GPA Platform Analyzer позволяет визуализировать профили выполнения различных задач и подзадач исследуемого приложения на платформе в целом (то есть и на CPU, и на GPU). Поскольку использование многоядерных процессоров в персональных компьютерах стало повсеместным, для достижения наилучшей производительности необходимо эффективно использовать все доступные вычислительные ресурсы и оптимизировать нагрузку между всеми ядрами CPU и видеокартой.
GPA Platform Analyzer позволяет:
- оценить масштабируемость приложения в многоядерном окружении;
- исследовать зависимость между приложением и различными компонентами платформы (например, взаимозависимость между CPU и GPU);
- получать детализированнную информацию о выполнении задачи (необходимо добавление в код приложения вызовов Intel Tracing Technology (ITT) API);
- отслеживать состояния задачи с течением времени, позволяя при этом выяснить, на каком из ядер выполняется задача, и приостановлено ли её выполнение в данный момент.
Оптимизация приложения.
Предполагается, что оптимизация приложения должна начинаться с рассмотрения общей производительности приложения при помощи Intel GPA System Analyzer. Первичный анализ сцены с низким FPS должен выявить, чем ограничена производительность приложения – CPU или GPU. Основными средствами в этом должны стать графики загрузки CPU (CPU Utilization).
Далее важнейшим инструментом разработчика являются эксперименты с DirectX конвейером (pipeline). Предполагается следующая тактика применения экспериментов:
- Null Hardware – разработчик может оценить, как изменится FPS если отключить GPU на уровне драйвера (DirectX и приложение остаются работать).
- Null Driver – отключает все вызовы рисования DirectX. Позволяет оценить потенциальные возможности нашей программы при работе с "бесконечно быстрым" GPU и "бесконечно быстрым" драйвером.
- 2x2 Texture и Disable Texture Filtering – позволяют оценить нагрузку на текстурный блок GPU. Если применение данного эксперимента дает значительный эффект – можно задуматься об упрощении текстур.
- Simple Pixel Shader – упрощение пиксельного шейдера позволяет понять, является ли вычислительная сложность шейдера проблемой. Данный эксперимент необходимо сочетать с 2x2 Texture и 1x1 Scissor Rect для определения вклада текстурного блока в производительность шейдера.
- 1x1 Scissor Rect позволяет отсечь все пиксели после обработки пиксельным шейдером. Если наблюдается заметный прирост FPS, мы можем сказать, что проблема кроется в скорости заполнения (Fill Rate). Необходим анализ Stencil и Alpha Blending операций (эксперименты Disable Alpha Blending, Disable Alpha Test).
Дальнейшая детальная оптимизация графического фрейма включает в себя перехват фрейма (Frame Capture) и анализ с использованием Intel GPA Frame Analyzer.
Основные факторы, влияющие на производительность:
- Скорость заполнения и пиксельные шейдеры (Fill Rate & Pixel Shaders). Для увеличения скорости заполнения следует сосредоточиться на уменьшении числа обрабатываемых пикселей. Для оптимизации работы следует попытаться:
- Сконфигурировать приложение под меньшее разрешение.
- Уменьшить сложность пиксельных шейдеров.
- Ограничить использование эффектов требующих двухпроходной отрисовки.
- Использовать проверку на загораживание (Occlusion Query). Такая проверка используется для определения числа потенциально видимых пикселей объекта при помощи рисования не самого объекта, а его ограничивающего объема. Если Occlusion Query возвращает ноль, это значит, что ни один пиксель ограничивающего объема, а значит, и самого объекта, не был виден, следовательно, объект можно не рисовать. Такая проверка максимально эффективна для сложных объектов с большим количеством вершин.
- Вершинные шейдеры (Vertex Shaders). Для оптимизации работы с геометрией следует попытаться:
- Уменьшить сложность вершинных шейдеров.
- По возможности, использовать triangle strips вместо списка треугольников и triangle fan.
- Использовать встроенные DXUT функции по оптимизации геометрии для увеличения эффективности кеша вершин.
- Использовать Level of Detail (LOD) для высокополигональных моделей.
- Текстуры (Textures). Для оптимизации работы с текстурами следует попытаться
- Уменьшить использование текстур высокого разрешения.
- Использовать анизотропную фильтрацию только там, где она действительно нужна.
- Максимально использовать сжатые форматы текстур.
- Использовать FP (floating-point) текстуры только там, где это необходимо.
- Использовать FP текстуры с минимально возможной точностью и числом каналов.
- Количество вызовов функций отрисовки и смены состояний (DP Сalls & State Changes). Большое количество вызовов отрисовки, смены состояний конвейера могут существенно замедлить работу приложения, поэтому следует:
- Использовать более оптимальный алгоритм проверки на видимость объектов в игровом движке.
- По возможности объединять геометрические объекты в один.
- Сортировать объекты по материалам, шейдерам для уменьшения числа смен стейтов графического конвейера.
- Контроль задержек между графическими функциями (Inter Erg Stalls). Важным аспектом оптимизации может стать уменьшение времени, которое программа проводит непосредственно между графическими вызовами. Следует контролировать количество изменений состояний DirectX (DirectX State Changes) и время изменения ресурсов (Index/Vertex Buffer Locks). В некоторых случаях GPU может оказаться недозагруженным.