Я запускаю приложение OpenGL ES3.2 на устройстве Android-9 Xiaomi mi A3 .
Заикание кадров, время от времени приложение на мгновение зависает.
С моим профилировщиком я смог определить, что пауза происходит в вызове eglSwapBuffers () .
Теперь, как правило, 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 выполняется, даже если размер сцены не меняется.