eglQuerySurface дает неправильный размер - PullRequest
5 голосов
/ 30 сентября 2011

Когда я поворачиваю свое устройство и мое приложение получает APP_CMD_CONFIG_CHANGED, я пытаюсь обновить окно просмотра OpenGL следующим образом:

EGLint width;
EGLint height;
eglQuerySurface(display,surface,EGL_WIDTH,&width);
eglQuerySurface(display,surface,EGL_HEIGHT,&height);

glViewport(0,0,width,height);

MY_LOG_MACRO2("New window size: %d x %d",width,height);

Это работает примерно в 20% случаев.Другие 80% времени ширина и высота являются предыдущими значениями.Другими словами, большую часть времени, когда я переключаю свое устройство в альбомный режим, размер портрета регистрируется.И когда я возвращаюсь к портрету, размер ландшафта записывается в журнал.

Мне не особо повезло с получением размера от ANativeWindow.

Что мне делатьполучить правильный размер окна после поворота?

Обновление:

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

Ответы [ 2 ]

1 голос
/ 15 октября 2012

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

Два вызова eglQuerySurface() для получения ширины и высоты занимают около 10 микросекунд (100 миллисекунд при вызове 10000 раз), поэтому это не снижает производительность и дает 100% гарантию того, что поворот экрана будет обработан.

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

0 голосов
/ 02 октября 2011

Может не работать, потому что, например, размер поверхности может быть установлен при создании контекста, и вы запрашиваете «предыдущий» размер (когда был создан контекст). Редактировать: Я протестировал его на SGS2 (2.3.5) и сразу же получаю правильные результаты, поэтому это может быть проблема поставщика устройства (или проблема версии Android).

Edit2: Похоже, что во время тестирования я допустил ошибку, я тоже получаю странные результаты, как @IronMensan.Иногда это работает правильно, но в основном нет.Извините за мою ошибку.Поэтому я бы остановился на воссоздании контекста EGL, как и в моем первоначальном ответе (ниже).

Когда я получаю APP_CMD_CONFIG_CHANGED, я просто просто уничтожаю и воссоздаю контекст EGL (с шейдерами, текстурами и т. Д.), Аналогично при полученииAPP_CMD_TERM_WINDOW -> APP_CMD_INIT_WINDOW.

...