我有一个基于OpenGL的渲染管道过滤图像,我现在也想用它来处理视频。异步渲染到CAEAGLLayer
在一端,如果管道是从视频文件中获取帧的AVPlayer
,另一端是我的预览视图,由CAEAGLLayer
支持。渲染本身在不同的线程上发生异步,因为它非常昂贵。该视图挂钩到CADisplayLink
,每触发一次新的异步渲染刷新。当管道完成渲染到图层的渲染缓冲区后,我打电话给presentRenderbuffer:
在屏幕上(在渲染线程中)显示它。在渲染仍在进行时发生绘制请求将被忽略。
这工作 - 但是,我似乎是与显示刷新同步问题。当我将显示链接的frameInterval
设置为1(每帧调用一次)时,我最终得到〜2 FPS(实际视图刷新)。如果我将它设置为2(每隔一帧调用一次),我突然得到15 FPS。将其设置为4将FPS降低至2。
我的猜测是,presentRenderbuffer:
的异步调用发生在运行循环中的“错误时刻”,并被系统忽略或延迟。
现在我想知道在视图中显示异步渲染结果的最佳做法是什么。我能找到的所有示例和文档仅描述单线程案例。