【发布时间】:2018-02-28 06:23:54
【问题描述】:
我有一个CVPixelBuffer,我正在尝试在屏幕上有效地绘制它。
转换成NSImage 的效率不高的方法有效,但速度很慢,丢掉了大约 40% 的帧。
因此,我尝试使用CIContext 的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,但我似乎无法找出它应该去哪里。
【问题讨论】:
-
您好,欢迎来到 SO。在您将问题标记为已关闭之前,我建议您重写它,因为在当前状态下它不适合 SO Q&A 格式。请添加一些描述特定问题的实际代码。
-
我已经添加了使用的代码......但它并不多。
-
我对 OSX 不是很熟练,但我认为您必须将 gl-context 设置为当前(使用
[glContext makeCurrentContext];。并且不要忘记在您使用后交换缓冲区([glContext flushBuffer];)渲染。 -
这是有道理的,但它不起作用(已经试过了)。通过将所有代码移动到 NSOpenGLView 中并在其
drawRect:方法中调用drawImage:方法并在最后调用glFlush(),我确实取得了一点突破。但是,图像显示在屏幕的右上角,并且非常模糊。这个定位让我想起了 iOS 上的 GL 渲染器是如何工作的……所以我确实知道如何解决这个问题。 -
在我看来,您正在混合使用 OpenGL 和 OpenGL-ES(即“CI 上下文”)。 Apple Developers site 有很多信息
标签: macos opengl render core-image cvpixelbuffer