【发布时间】:2012-10-19 04:20:03
【问题描述】:
在我们的应用中,我们在 CAEAGLLayer 上方有 UIScrollView。 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 模拟器中,它的行为也是一样的,请看视频: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 中绘制一组白色方块并为其设置动画,并为一组红色 UIView 执行相同的操作。在红色和白色方块之间很容易看到滞后。
【问题讨论】:
-
+1 表示优秀(精简)的示例项目。
-
使用 Xcode 6+,要让示例项目正常工作,必须:
#import <OpenGLES/ES1/glext.h>in ViewController.mm
标签: opengl-es uikit core-animation