eglSwapBuffers () иногда занимает в 30 раз больше времени, чем другие кадры - PullRequest
0 голосов
/ 09 ноября 2019

Я запускаю приложение OpenGL ES3.2 на устройстве Android-9 Xiaomi mi A3 .

Заикание кадров, время от времени приложение на мгновение зависает.

С моим профилировщиком я смог определить, что пауза происходит в вызове eglSwapBuffers () .

profile-run

Теперь, как правило, eglSwapBuffers () занимает 0,7 мс или около того. Это нормально, поскольку у меня есть 16,6 мс для кадра 60 Гц.

Но в приведенном выше профиле он показывает заикание, когда замена буфера занимает коэффициент 30 больше времени.

Также обратите внимание: это время настенных часов , процессорное время кажется нормальным, поэтому дело не в занятом процессоре, а в ожидающем. (Вероятно, ожидание на графическом процессоре.)

Кадр, в котором это происходит, я не делаю ничего, отличного от других кадров: без дополнительного рисования, без дополнительной загрузки.

Контекст OpenGL довольно ванильный:

  • 24-битная глубина
  • 32-битный RGBA
  • Без трафарета
  • Контекст ES 3.2
  • Adreno 610 GPU
I/hexa    (31916): GL_VENDOR   Qualcomm
I/hexa    (31916): GL_RENDERER Adreno (TM) 610
I/hexa    (31916): GL_VERSION  OpenGL ES 3.2 V@378.0 (GIT@6cbc6c9, Ib736691963) (Date:04/25/19)

Я сделал много других приложений Android OpenGL, и ни одно из них не демонстрирует такого поведения.

Приложение основано на NDK и использует класс NativityActivity,и также использует android_native_app_glue.h

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

ОБНОВЛЕНИЕ: Я добавил glFlush() до тогоeglSwapBuffers () и задержка переместились во флэш. Так что это действительно тот случай, когда внезапно, много дополнительной работы над OpenGL выполняется, даже если размер сцены не меняется.

...