为了账号安全,请及时绑定邮箱和手机立即绑定

CADisplayLink OpenGL渲染会破坏UIScrollView行为

CADisplayLink OpenGL渲染会破坏UIScrollView行为

潇潇雨雨 2019-08-31 16:19:16
SO上有一些类似的问题(最后的链接),但是没有一个能让我解决我的问题,所以这里有:我正在使用OpenGL渲染来制作图像平铺和缓存库以供在游戏项目中使用,我想劫持UIScrollView的物理特性以允许用户在图像周围导航(因为它有很好的反弹行为,可能是好好利用它)。所以我有一个UIScrollView,我用它来获取纹理的渲染视图,但是有一个问题 - 在滚动视图上移动会阻止CADisplayLink触发,直到用户完成滚动(看起来很糟糕)。一个临时修复是使用NSRunLoopCommonModes而不是默认的运行模式,但不幸的是,这打破了我正在测试的某些手机上的滚动视图行为的某些方面(3GS和模拟器似乎工作正常,而iPhone4和3G没有“T)。有谁知道如何解决CADisplayLink和UIScrollView之间的这种冲突,或者知道如何修复在其他运行模式下工作的UIScrollView?提前致谢 :)承诺链接到类似的问题: UIScrollView损坏并停止使用OpenGL渲染滚动(相关的CADisplayLink,NSRunLoop)在iPhone上拖动UIScrollView时,OpenGL ES视图中的动画会冻结
查看完整描述

3 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

我的简单解决方案是在运行循环处于跟踪模式时将渲染速率减半。我的所有UIScrollView现在都能顺利运行。


这是代码片段:


- (void) drawView: (CADisplayLink*) displayLink

{

    if (displayLink != nil) 

    {

        self.tickCounter++;


        if(( [[ NSRunLoop currentRunLoop ] currentMode ] == UITrackingRunLoopMode ) && ( self.tickCounter & 1 ))

        {

            return;

        }


        /*** Rendering code goes here ***/

     }

}


查看完整回答
反对 回复 2019-08-31
?
largeQ

TA贡献2039条经验 获得超7个赞

以下帖子的答案对我来说非常有效(它看起来与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 MPMediaPicker

self.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 anymore

self.paused = NO;

[updateAndRenderTimer invalidate];

updateAndRenderTimer = nil;

简单有效。我不确定这是否会导致某种类型的工件/撕裂,因为渲染与屏幕刷新分离,但在我们的案例中使用带有NSRunLoopCommonModes的CADisplayLink完全打破了UIScrollView。使用NSTimer对我们的应用程序看起来很好,绝对比没有渲染好很多。

查看完整回答
反对 回复 2019-08-31
  • 3 回答
  • 0 关注
  • 670 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信