bee*_*fon 24 core-animation opengl-es uikit
在我们的应用程序中,我们在CAEAGLLayer上面有UIScrollView.UIScrollView包含一些UIViews(红色矩形).在CAEAGLLayer中,我们绘制白色矩形.白色矩形的中心与红色矩形的中心相同.当UIScrollView滚动时,我们更新CAEAGLLayer中白色矩形的位置并渲染它们.
我们得到了预期的结果:白色矩形的中心总是与红色矩形的中心相同.
但是我们无法将CAEAGLLayer的更新与UIScrollView中的视图移动同步.我们有一些错误 - 红色矩形落后于白色矩形.
粗略地说,我们真的想让CAEAGLLayer与UIScollView一起延迟.
我们准备了示例代码.在设备上运行并滚动,您将看到白色矩形(由OpenGL绘制)比红色矩形(常规UIViews)移动得更快.在scrollViewDidScroll:委托调用中正在更新OpenGL.
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(...)];
}
Run Code Online (Sandbox Code Playgroud)
在简化的样本中可以很容易地证明同样的问题.工作的xcodeproj可以在以下位置找到:
https://www.dropbox.com/s/vznzccibhlf8bon/simple_sample.zip
示例项目基本上在OpenGL中绘制和动画一组WHITE方块,并为RED组的UIViews做同样的操作.红色和白色方块之间很容易看到滞后.
小智 8
实际上,您无法使用当前API同步它们.MobileMaps.app和Apple Map Kit使用CAEAGLLayer asynchronous上的私有属性来解决此问题.
这是相关的雷达:http://openradar.appspot.com/radar?id = 3118401
在挖了一点之后我想扩展我以前的答案:
scrollViewDidScroll:在从runloop进行的正常CATransaction更新期间,稍后执行UIKit绘图时,立即从方法内完成OpenGL渲染.
要将UIKit更新与OpenGL呈现同步,只需将它们包含在一个显式事务中并刷新它以强制UIKit backbaordd立即提交更改:
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView {
[CATransaction begin];
[overlayView updateVisibleRect:CGRectMake(...)];
[openGlView updateVisibleRect:CGRectMake(...)];
[CATransaction flush]; // trigger a UIKit and Core Animation graphics update
[CATransaction commit];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3779 次 |
| 最近记录: |