iphone - CADisplayLink OpenGL 渲染破坏了 UIScrollView 行为

标签 iphone opengl-es

SO 上有一些类似的问题(链接在最后),但它们都不允许我解决我的问题,所以这里是:

我正在使用 OpenGL 渲染来制作用于游戏项目的图像平铺和缓存库,并且我想劫持 UIScrollView 的物理原理以允许用户在图像中导航(因为它具有良好的弹跳行为) ,不妨使用它)。所以我有一个 UIScrollView,我用它来获取纹理的渲染 View ,但有一个问题 - 在 ScrollView 上移动会阻止 CADisplayLink 触发,直到用户完成滚动(这看起来很糟糕)。一个临时修复是使用 NSRunLoopCommonModes 而不是默认的运行模式,但不幸的是,这破坏了我正在测试的某些手机上 ScrollView 行为的某些方面(3GS 和模拟器似乎工作正常,而 iPhone4 和 3G 则不支持) 't)。

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

promise 提供类似问题的链接: UIScrollView broken and halts scrolling with OpenGL rendering (related CADisplayLink, NSRunLoop)

Animation in OpenGL ES view freezes when UIScrollView is dragged on iPhone

最佳答案

CADisplayLink 触发的主线程更新缓慢可能会破坏 UIScrollView 的滚动行为。当对 CADisplayLink 使用 NSRunLoopCommonModes 时,您的 OpenGL ES 渲染可能会花费足够长的时间来处理每一帧,从而导致 UIScrollView 的计时失效。

解决此问题的一种方法是使用 Grand Central Dispatch 串行队列在后台线程上执行 OpenGL ES 渲染操作。我在最近更新到 Molecules 时做到了这一点(可以在该链接中找到其源代码),并且在我的 CADisplayLink 上使用 NSRunLoopCommonModes 进行测试时,我没有看到屏幕上的表格 View 的 native 滚动行为有任何中断与渲染同时进行。

为此,您可以创建一个 GCD 串行调度队列,并将其用于特定 OpenGL ES 上下文的所有渲染更新,以避免两个操作同时写入上下文。然后,在 CADisplayLink 回调中,您可以使用如下代码:

if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0)
{
    return;
}

dispatch_async(openGLESContextQueue, ^{

    [EAGLContext setCurrentContext:context];

    // Render here

    dispatch_semaphore_signal(frameRenderingSemaphore);
});

其中 frameRenderingSemaphore 是之前创建的,如下所示:

frameRenderingSemaphore = dispatch_semaphore_create(1);

如果该代码不在执行过程中,则此代码只会将新的帧渲染操作添加到队列中。这样,CADisplayLink 可以连续触发,但如果处理帧的时间超过 1/60 秒,则不会因待处理的渲染操作而使队列重载。

我再次在 iPad 上进行了尝试,发现表格 View 的滚动操作没有受到干扰,只是由于 OpenGL ES 渲染消耗了 GPU 周期而速度稍有减慢。

关于iphone - CADisplayLink OpenGL 渲染破坏了 UIScrollView 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5944050/

相关文章:

iphone - 我想在我的应用程序中调用 DropBox Api 来上传文件并下载

iphone - 私有(private) iPhone 应用程序,没有 App Store?

java - 您将如何从一个类的所有实例中调用一个方法?

c++ - 什么是 Regal OpenGL?

opengl-es - 在 OpenGL ES 中绘制一个球体

Android native GLES 2.0 空白屏幕与 MVP 矩阵

iOS 10 无法打开 Spotify 应用

ios - 为导航栏设置色调颜色恢复为 iOS 6 蓝色

iphone - 如何在表格单元格上滑动并使其调用函数?

ios - 从 OpenGL 中的窗口触摸获取相应的 3D 对象坐标/顶点