2

我有一个CVPixelBuffer我正在尝试有效地在屏幕上绘制的东西。

转化为NSImage作品的效率不高,但速度很慢,丢掉了大约 40% 的帧。

因此,我尝试使用CIContext's在屏幕上渲染它drawImage:inRect:fromRect。使用谁的视图进行CIContext了初始化,该NSOpenGLContext视图设置为我的 VC 的视图。当我有一个新图像时,我调用drawImage不会吐出任何错误的方法......但也不会在屏幕上显示任何内容(当我的上下文设置不正确时它确实记录了错误)。

我试图找到一个如何在 MacOS 上完成此操作的示例,但现在一切似乎都适用于 iOS。

编辑:

这是我正在使用的一些代码。我省略了不相关的部分

viewDidLoad我初始化 GL 和 CI 上下文时

NSOpenGLPixelFormatAttribute pixelFormatAttr[] = {
  kCGLPFAAllRenderers, 0
};
NSOpenGLPixelFormat *glPixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes: pixelFormatAttr];
NSOpenGLContext *glContext = [[NSOpenGLContext alloc] initWithFormat:glPixelFormat shareContext:nil];
glContext.view = self.view;

self.ciContext = [CIContext contextWithCGLContext:glContext.CGLContextObj pixelFormat:glPixelFormat.CGLPixelFormatObj colorSpace:nil options:nil];

然后,当一个新框架准备好时,我会:

dispatch_async(dispatch_get_main_queue(), ^{
       [vc.ciContext drawImage:ciImage inRect:vc.view.bounds fromRect:ciImage.extent];
        vc.isRendering = NO;
});

我不确定我在正确的地方调用 draw,但我似乎无法找出这应该去哪里。

4

1 回答 1

1

如果CVPixelBuffer具有该kCVPixelBufferIOSurfaceCoreAnimationCompatibilityKey属性,则支持IOSurface(通过 检索CVPixelBufferGetIOSurface)可以直接传递给contentsa 的属性CALayer

这可能是显示CVPixelBuffer.

于 2019-01-22T03:19:43.943 回答