В последнее время меня это беспокоит. Достаточно просто собрать приложение OpenGL ES, которое поддерживает как портретную, так и альбомную ориентацию. Но во время автоповорота система, кажется, просто принудительно растягивает буфер рендеринга до новых размеров один раз, автоповорачивает, а затем вызывает обычный -layoutSubviews
-> -resizeFromLayer:
и т. Д., Чтобы чертежи можно было настроить под новые размеры области просмотра.
Большинство приложений, которые я видел, которые поддерживают как портретную, так и альбомную ориентацию, похоже, соглашаются на этот простой подход. Но мне интересно, смогу ли я сделать лучше ...
Возможно, мне следует перехватить авторотацию до того, как это произойдет (используя обычные методы UIViewController
), "развернуть" буфер рендеринга до идеального квадрата самого длинного размера экрана (например, 1136px x 1136px на iPhone 5), чтобы он "истекал кровью" вне экрана, выполнить автоповорот (без изменения размера буфера рендеринга и, следовательно, без растяжения, как при переключении, например, между двумя альбомными ориентациями), и, наконец, снова настроить буфер кадра, чтобы избавиться от невидимых, «потраченных впустую» полей за пределами экрана? (конечно, у меня всегда мог быть квадратный буфер кадра, но это было бы неэффективно с точки зрения скорости заполнения)
Какие-либо предложения? Есть ли лучший способ добиться этого, о котором я не думал?
ИЗМЕНИТЬ
Я изменил свой -resizeFromLayer:
код следующим образом:
CGRect bounds = [layer bounds];
// Enlarge layer to square of the longest side:
if (bounds.size.width < bounds.size.height) {
bounds.size.width = bounds.size.height;
}
else{
bounds.size.height = bounds.size.width;
}
[layer setBounds:bounds];
// Adjust size to match view's layer:
[_mainContext renderbufferStorage:GL_RENDERBUFFER
fromDrawable:(CAEAGLLayer*) [_view layer]];
// Query the new size:
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &_backingWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_backingHeight);
// (etc., you know the drill...)
... И это работает! В нынешнем виде у меня всегда есть расточительный квадратный буфер рендеринга за пределами экрана, но это всего лишь проверка концепции. В производственном коде я бы выполнил указанное изменение размера до квадрата непосредственно перед авторотацией, а затем вернулся к размеру экрана.