Настройка оптимизации на основе профиля в Visual Studio

Поддержка оптимизации на основе профиля была представлена ​​в AGDE версии 22.2.71.

Поиск настроек PGO

Откройте настройки проекта из Solution Explorer.

Меню свойств обозревателя решений Visual Studio для текущего проекта.

Рис. 1. Окно обозревателя решений Visual Studio.

Убедитесь, что для вашей платформы установлена ​​конфигурация Android (например, Android-arm64-v8a ).

На левой панели выберите «Свойства конфигурации» > «Общие» . Найдите группу свойств под названием PGO .

Диалоговое окно свойств проекта, в котором показаны общие свойства и выделены настройки PGO.

Рисунок 2. Диалоговое окно «Свойства проекта».

Включить сборки с поддержкой PGO в проекте

Добавьте в свой проект новую конфигурацию под названием Instrumented . Это основано на конфигурации, которую вы используете во время разработки для тестирования, которая должна быть вашей традиционной оптимизированной сборкой (вы все равно можете включить дополнительные функции отладки, пока сохраняете настройки оптимизации компилятора).

Нажмите «Диспетчер конфигураций…» в диалоговом окне страницы свойств.

Верхняя часть диалогового окна «Страницы свойств» с раскрывающимися списками «Конфигурация активного решения» и «Платформа», а также кнопкой «Диспетчер конфигураций».

Рисунок 3: Диалоговое окно Configuration Manager.

В диалоговом окне «Диспетчер конфигураций» выберите раскрывающийся список «Конфигурация активного решения» и выберите <Создать…> .

Диалоговое окно «Диспетчер конфигураций» с открытым раскрывающимся списком «Конфигурация активного решения» и выделенным параметром «Новый».

Рисунок 4. Создание новой конфигурации сборки.

… и создайте новую конфигурацию, оснащенную PGO.

Диалоговое окно «Конфигурация нового решения», в котором создается новая конфигурация сборки с поддержкой PGO на основе существующей конфигурации сборки выпуска.

Рисунок 5: Диалоговое окно конфигурации нового решения.

Чтобы включить сборку в режиме PGO-Instrumented и создать профиль для своей игры, выберите «Инструментированный» в списке опций для параметра «Режим оптимизации на основе профиля» .

Диалоговое окно «Свойства проекта», открытое в разделе «Общие настройки», с показанными настройками PGO и режимом оптимизации по профилю, установленным на «Инструментированный».

Рис. 6. Диалоговое окно «Свойства проекта», в котором выделены настройки PGO.

Для параметра «Профили оптимизации по профилю» введите путь к папке, в которую будет записываться файл необработанных выходных данных профиля на вашем устройстве Android. Обычно это значение должно иметь вид /data/data/<package name>/cache/ , где <package name> это полное имя пакета вашего APK, например com.google.sample.tunnel .

Более подробную информацию о том, как это работает, можно найти в документации Clang .

Запись данных профиля с поддержкой PGO на ваше устройство

Данные PGO обычно записываются на устройство инструментальной системой PGO при выходе из процесса. На Android приложения не закрываются — они всегда закрываются. Это означает, что функция записи на диск по умолчанию никогда не срабатывает, поэтому вашему приложению требуется записывать данные PGO вручную.

В вашем приложении вы должны явно вызвать __llvm_profile_write_file , чтобы записать данные профиля. Этот символ доступен только при сборке сборки с использованием PGO. Чтобы упростить это, мы рекомендуем использовать следующий шаблон при прямом объявлении __llvm_profile_write_file .

#ifdef PGO_INSTRUMENT
extern "C" int __llvm_profile_write_file(void);
#else
extern "C" int __llvm_profile_write_file(void) { return 0; }
#endif

Вызов этой функции записывает данные профиля в папку, указанную вами ранее.

Выполнение прогона профиля

Чтобы создать профиль, вы запускаете APK, созданный с помощью инструментов PGO, на целевом устройстве. После того как вы выполнили код и вызвали вызов функции __llvm_profile_write_file , ваше приложение запишет данные профиля в хранилище.

На этом этапе скопируйте профили обратно с устройства для использования компилятором.

Подготовка данных профиля для использования компилятором

При изолированном использовании инструмент командной строки llvm-profdata , который поставляется как часть Clang/LLVM в Android NDK, используется для подготовки файлов данных профиля для использования компилятором во время оптимизации сборки на основе профиля.

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

Создание проекта с включенной оптимизацией на основе профиля

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

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

В диалоговом окне «Конфигурация нового решения» создается конфигурация сборки на основе сборки выпуска, но на этот раз с PGO-Optimized в качестве имени новой конфигурации сборки.

Рисунок 7. Создание новой конфигурации сборки, оптимизированной для PGO.

Установите для параметра «Режим оптимизации на основе профиля» на страницах свойств проекта значение «Оптимизированный» .

Диалоговое окно «Свойства проекта», открытое в разделе «Общие настройки», с показанными настройками PGO и режимом оптимизации по профилю, установленным на «Оптимизированный».

Рис. 8. Установка режима оптимизации PGO на «Оптимизированный».

Скопируйте файлы с устройства и добавьте их в свой проект в обозревателе решений. Эти файлы данных профиля подбираются компилятором при следующем построении конфигурации, оптимизированной для PGO, и используются для настройки того, как компилятор оптимизирует ваш код.

Вы можете скопировать файлы данных профиля в свой проект с устройства с помощью ADB или с помощью Android Device Explorer.

Использование оптимизации на основе профиля вне AGDE

Если вы используете систему сборки, которая не поддерживается AGDE, вам может потребоваться напрямую отредактировать сборку. В документации Clang описаны необходимые ключи — -fprofile-generate и -fprofile-use .

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