私たちのアプリでは、CAEAGLLayer の上に UIScrollView があります。UIScrollView には、いくつかの UIView (赤い四角形) が含まれています。CAEAGLLayer では、白い四角形を描画します。白い四角形の中心は、赤い四角形の中心と同じです。UIScrollView がスクロールするとき、CAEAGLLayer 内の白い四角形の位置を更新してレンダリングします。
期待どおりの結果が得られています。白い四角形の中心は、赤い四角形の中心と常に同じです。
しかし、CAEAGLLayer の更新を UIScrollView 内のビューの動きと同期させることはできません。ある種のタイミングのずれがあります – 赤い四角形は白い四角形より遅れています。
大雑把に言えば、CAEAGLLayer を UIScollView と一緒にラグさせたいのです。
サンプルコードをご用意しました。デバイスで実行してスクロールすると、白い四角形 (OpenGL で描画) が赤い四角形 (通常の UIView) よりも速く動いていることがわかります。OpenGL は scrollViewDidScroll: デリゲート呼び出し内で更新されています。
https://www.dropbox.com/s/kzybsyu10825ikw/ios-opengl-scrollview-test.zip
iOS シミュレーターでも同じように動作します。ビデオをご覧ください: 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
サンプル プロジェクトは基本的に、OpenGL で一連の白い正方形を描画してアニメーション化し、同じことを一連の RED UIViews に対して行います。遅れは、赤と白の四角の間で簡単に確認できます。