Android 4.3 Профилирование на экране GPU – длительное время ожидания gfx

Я только что обновил Galaxy Nexus до 4.3 и включил новую функцию профилирования на экране GPU и посмотрю следующий результат для экрана установки Android:

Введите описание изображения здесь

По данным платформы :

[With] colors indicating time spent creating drawing commands (blue), issuing the commands (orange), and waiting for the commands to complete (yellow). 

Даже на очень простом экране есть много примеров того, что время обновления экрана выше порога для гладкой 60 кадров в секунду (зеленая линия), и в основном это связано с тем, что существует много случаев, когда обновление будет тратить значительное время на ожидание команд (Желтая линия *), а в других случаях этот шаг почти мгновен. Это не является чем-то особенным для приложения Setting, но, похоже, присутствует для всех приложений, которые я тестировал до сих пор. * Выглядит более оранжевым, чем желтый для меня

Я хочу знать:

  1. Является ли это время «ожиданием завершения команд» означает, что команды экрана активно обрабатываются, и, таким образом, время точно отражает время, затрачиваемое на рисование экрана. ИЛИ на этот раз включает время ожидания видеосинхронизации (хотя я думаю, что трехмерный буфер будет использоваться для устранения этого требования)?
  2. Время, затрачиваемое на «ожидание завершения команд», будет сильно колебаться даже при рисовании одного и того же экрана (немного прокрутите вверх и вниз по тому же ScrollView), есть ли какие-либо указания относительно того, как уменьшить это колебание (или если оно может быть уменьшено на все)?

[Редактировать:]

Обновлен Nexus 7, а это еще хуже:

Введите описание изображения здесь

Целых 5 кадров пропускаются «в ожидании завершения команд», и это действительно проявилось в использовании, приложение было очень прерывистым и не реагирующим.

[Редактировать 2:] Я выполнил эти действия в этой статье, чтобы вызвать TRIM в течение ~ 3 дней, поэтому N7 должен быть «чистым», так как он не получит заводского сброса.

  • Устройство простаивает более часа
  • В течение последних 24 часов не выполнялось событие в режиме ожидания.
  • Устройство заряжается 30-процентной батареей или имеет 80-процентную батарею

Теперь Google Maps выглядит немного лучше (см. Ниже), поэтому некоторые из проблем могут быть связаны с скоростью доступа к флэш-памяти, хотя я не знаю, как это сделать.

Введите описание изображения здесь

Тем не менее, поскольку Galaxy Nexus сбрасывается с завода, его длительное «ожидание завершения команд» не может быть связано с отсутствием команды TRIM, и, следуя вышеприведенным шагам, действительно не улучшалось. Итак, мы вернулись на квадратный …

«Ожидание завершения команд» указывает, что существуют зависимости от визуализированных кадров. Например, приложение может использовать glReadPixels для чтения из визуализированного фрейма. Это означает, что после того, как кадр был отправлен на графический процессор для рендеринга, приложение блокируется до тех пор, пока не будет завершен этот кадр (тогда как обычно он сможет продолжить работу сразу). Android пытается позволить приложению разместить столько команд рендеринга, насколько это возможно, поэтому внезапное введение ожидания может означать, что приложение должно ждать, пока несколько ранее поставленных кадров будут нарисованы, прежде чем кадр, который он ждет, будет визуализирован.

glReadPixels – не единственная команда, которая вызывает подобную зависимость. Если приложение хочет писать текстуру, которая в настоящее время используется, она должна подождать, пока все кадры, зависящие от текстуры, не закончатся. Это правдоподобно, что происходит с Картами Google: если каждая плитка карты является текстурой, она может повторно использовать старую застекленную плитку, написав новую плиту, в которую она будет готова. Как только приложение поставило в очередь фрейм, который не использует старую плитку, он пытается записать в эту текстуру, но на самом деле текстура все еще используется для рендеринга ранее поставленных фреймов. Приложение должно ждать завершения этих кадров (и графический процессор больше не читает из «неиспользуемой» текстуры), прежде чем он сможет писать.

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

Что касается приложения «Настройки», может быть, что бэкэнд Android для Android делает то же самое для повторного использования текстуры для значков, но это всего лишь предположение. Возможно, Galaxy Nexus использует 2D-компоновщик для создания композиции кадра, что экономит электроэнергию, но ценой введения ожидания в драйвере. Я не знаю, будет ли такая зависимость измеряться на графике.