Как синхронизировать рисунок 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. Отставание можно легко увидеть между красными и белыми квадратами.

Ответы на вопрос(6)

Ваш ответ на вопрос