CADisplayLink OpenGL渲染会破坏UIScrollView行为

SO上有一些类似的问题(最后的链接),但是没有一个能让我解决我的问题,所以这里有:


我正在使用OpenGL渲染来制作图像平铺和缓存库以供在游戏项目中使用,我想劫持UIScrollView的物理特性以允许用户在图像周围导航(因为它有很好的反弹行为,可能是好好利用它)。所以我有一个UIScrollView,我用它来获取纹理的渲染视图,但是有一个问题 - 在滚动视图上移动会阻止CADisplayLink触发,直到用户完成滚动(看起来很糟糕)。一个临时修复是使用NSRunLoopCommonModes而不是默认的运行模式,但不幸的是,这打破了我正在测试的某些手机上的滚动视图行为的某些方面(3GS和模拟器似乎工作正常,而iPhone4和3G没有“T)。


有谁知道如何解决CADisplayLink和UIScrollView之间的这种冲突,或者知道如何修复在其他运行模式下工作的UIScrollView?提前致谢 :)


承诺链接到类似的问题: UIScrollView损坏并停止使用OpenGL渲染滚动(相关的CADisplayLink,NSRunLoop)


在iPhone上拖动UIScrollView时,OpenGL ES视图中的动画会冻结


潇潇雨雨
浏览 671回答 3
3回答

宝慕林4294392

我的简单解决方案是在运行循环处于跟踪模式时将渲染速率减半。我的所有UIScrollView现在都能顺利运行。这是代码片段:- (void) drawView: (CADisplayLink*) displayLink{    if (displayLink != nil)     {        self.tickCounter++;        if(( [[ NSRunLoop currentRunLoop ] currentMode ] == UITrackingRunLoopMode ) && ( self.tickCounter & 1 ))        {            return;        }        /*** Rendering code goes here ***/     }}

largeQ

以下帖子的答案对我来说非常有效(它看起来与Till的答案非常相似):UIScrollView暂停NSTimer直到滚动完成总结一下:当出现UIScrollView时禁用CADisplayLink或GLKViewController渲染循环,并启动NSTimer以所需的帧速率执行更新/渲染循环。从视图层次结构中关闭/删除UIScrollView时,重新启用displayLink / GLKViewController循环。在GLKViewController子类中,我使用以下代码出现在UIScrollView上:// disable GLKViewController update/render loop, it will be interrupted// by the UIScrollView of the MPMediaPickerself.paused = YES;updateAndRenderTimer = [NSTimer timerWithTimeInterval:1.0f/60.0f target:self selector:@selector(updateAndRender) userInfo:nil repeats:YES];[[NSRunLoop mainRunLoop] addTimer:updateAndRenderTimer forMode:NSRunLoopCommonModes];解雇UIScrollView:// enable the GLKViewController update/render loop and cancel our own.// UIScrollView wont interrupt us anymoreself.paused = NO;[updateAndRenderTimer invalidate];updateAndRenderTimer = nil;简单有效。我不确定这是否会导致某种类型的工件/撕裂,因为渲染与屏幕刷新分离,但在我们的案例中使用带有NSRunLoopCommonModes的CADisplayLink完全打破了UIScrollView。使用NSTimer对我们的应用程序看起来很好,绝对比没有渲染好很多。
打开App,查看更多内容
随时随地看视频慕课网APP