OpenGL: кадр частично переходит назад и вперед [закрыто]

8

Я работаю над проектом с SDL и OpenGL. Игра отлично работает на Windows, Linux, OS X и iOS. Тем не менее, версия Android показывает проблему на моем телефоне, в частности. Я проверил другое устройство, и там он прекрасно работает.

Проблема, с которой я сталкиваюсь - визуальный сбой. Это происходит в пакетном режиме: например: 90 кадров, а затем 40 кадров. Сам глюк довольно сложно описать, но я попробую. Экран обновляется частично корректно (с верхней части телефона примерно до половины вниз) и частично мигает. Эффект мерцания - это своего рода прыжки вперед и назад. Я думаю, что это связано с двойной буферизацией. Я думаю, потому что то, что я вижу на экране, прыгает вперед и назад каждый кадр. Как будто половина экрана - один кадр во времени, а следующий кадр - на 2 кадра позже. Полагаю, что это похоже на процессию Эхтернаха. Если я нанесу это на график, где время движется вниз, я думаю, что

          left half | right half  (phone is in landscape)
         ------------------------
time  1 |      1           1
time  2 |      2           2
time  3 |      3           1
time  4 |      4           4
time  5 |      5           3
time  6 |      6           6
time  7 |      7           5
time  8 |      8           8
time  9 |      9           7

Таким образом, правая половина - это один кадр во времени, а следующий кадр показывает предыдущий кадр. Это подтверждает мою теорию о том, что существует проблема с двойной буферизацией. Похоже, что каким-то образом не удается полностью обновить буфер, прежде чем он появится на экране, или что-то еще.

Кроме того, различие между хорошим и глюком на экране отличается от кадра к кадру, что, я думаю, доказывает, что это проблема синхронизации и сильно зависит от времени происходящего. Добавление glFinish();до SDL_GL_SwapWindow();звонка не помогает.

Информация о версии: SDL сообщает о включении vsync. Тем не менее, я считаю, что это не разрывает. Мой телефон Samsung Galaxy S3 mini работает под управлением Android 5.1.1 (CM12), а графический процессор (Mali-400) поддерживает OpenGL ES 2.0. Другие игры работают нормально на моем телефоне.

Мартейн Курто
источник
Какая модель телефона?
concept3d
Samsung Galaxy S3 mini. Запуск CyanogenMod 12.
Мартейн Курто
Я обнаружил, что это везде в моем телефоне, но более тонко. Даже в системном интерфейсе прокручивается меню.
Мартин Курто
2
Этот звук больше похож на ошибку в вашем телефоне. Я думаю, что обновление прошивки является наиболее вероятным способом ее решения.
Ролобо
@rolobo: Да, действительно. Однако я очень доволен всем остальным, и мой телефон - всего лишь тестовое устройство для этого проекта, а не часть моего основного процесса разработки.
Мартин Курто

Ответы:

0

Раздел readme говорит об этом:

Замечание об использовании метода рендеринга "грязных прямоугольников"

[...] когда вы обновляете только часть экрана в каждом кадре, вы можете заметить различные визуальные глюки на Android, которых нет на других платформах. Это вызвано тем, что SDL использует EGL в качестве системы поддержки для обработки контекстов OpenGL ES / ES2, в частности использование функции eglSwapBuffers. Как указано в документации к функции «Содержимое вспомогательных буферов всегда не определено после вызова eglSwapBuffers».

Установка для EGL_SWAP_BEHAVIOR атрибута поверхности значения EGL_BUFFER_PRESERVED невозможна для SDL, так как для него требуется EGL 1.4, доступный только на уровне API, поэтому единственным обходным решением, доступным на этой платформе, является перерисовка всего экрана в каждом кадре.

Ибрагим CS
источник
Пожалуйста, включите краткое изложение информации, относящейся к этой ссылке, и объяснение того, как информация отвечает на вопрос.
Тыкенн
... оригинальный вопрос ничего не говорил о рендеринге "грязных прямоугольников"?
Тревор Пауэлл