Как синхронизировать рисунок OpenGL с обновлениями UIKit
В нашем приложении у нас есть UIScrollView над CAEAGLLayer. UIScrollView содержит несколько UIViews (красные прямоугольники). В CAEAGLLayer мы рисуем белые прямоугольники. Центры белых прямоугольников совпадают с центрами красных прямоугольников. Когда UIScrollView прокручивает, мы обновляем позиции белых прямоугольников в CAEAGLLayer и отображаем их.
Мы получаем ожидаемый результат: центры белых прямоугольников всегда совпадают с центрами красных прямоугольников.
Но мы можем• синхронизировать обновления CAEAGLLayer с движением представлений внутри UIScrollView. У нас есть какая-то неудача - красные прямоугольники отстают от белых прямоугольников.
Говоря грубо, мы действительно хотим, чтобы CAEAGLLayer отставал вместе с UIScollView.
Мы подготовили образец кода. Запустите его на устройстве и выполните прокрутку, и вы увидите, что белые прямоугольники (нарисованные OpenGL) движутся быстрее красных (обычные UIViews). OpenGL обновляется в scrollViewDidScroll: делегат вызова.
https://www.dropbox.com/s/kzybsyu10825ikw/ios-opengl-scrollview-test.zip
Он ведет себя одинаково даже в iOS Simulator, просто посмотрите на видео:http://www.youtube.com/watch?v=1T9hsAVrEXw
Красный = UIKit, Белый = OpenGL
Код является:
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView {
// reuses red squares that are gone outside thw bounds
[overlayView updateVisibleRect:CGRectMake(...)];
// draws white squares using OpenGL under the red squares
[openGlView updateVisibleRect:CGRectMake(...)];
}
Редактировать:Та же самая проблема может быть легко продемонстрирована в значительно упрощенной выборке. Работающий xcodeproj можно найти по адресу:
https://www.dropbox.com/s/vznzccibhlf8bon/simple_sample.zip
Пример проекта в основном рисует и анимирует набор квадратов WHITE в OpenGL и делает то же самое для RED-набора UIViews. Отставание можно легко увидеть между красными и белыми квадратами.