【问题标题】:NSOpenGLLayer and multithreadingNSOpenGLLayer 和多线程
【发布时间】:2011-09-13 13:12:21
【问题描述】:

我使用 Cocoa 编写了一个 3D 查看器。 OpenGL 渲染在一个单独的线程中执行,该线程创建自己的 NSOpenGLContext。

在没有图层处理的情况下,3D 视图 drawRect 方法在刷新时被调用,OpenGL 线程进行刷新,一切都完美运行...

现在,我必须使用 Cocoa 层来实现应用程序。创建 3D NSView 时,会创建 NSOpenGLLayer 的子类并将其附加到视图。方法

(void)drawInOpenGLContext:NSOpenGLContext *)ctx
              pixelFormat:(NSOpenGLPixelFormat *)pixelFormat
             forLayerTime:(CFTimeInterval)timeInterval
              displayTime:(const CVTimeStamp *)timeStamp; 

由 Cocoa 调用,但我无法让我的 OpenGL 线程渲染任何内容。

我曾尝试在 OpenGL 线程中使用传递给 drawInOpenGLContext 的 OpenGL 上下文,我尝试过这样做

[layer setOpenGLContext:ctx]

在 OpenGL 线程中使用线程中创建的 OpenGL 上下文,依此类推,但没有任何效果。

【问题讨论】:

    标签: multithreading cocoa opengl calayer


    【解决方案1】:

    你记得在你的 NSView 上调用 setWantsLayer 吗?您可能需要从您的 NSView 中调用它以使其成为图层托管视图。请参阅 NSView setWantsLayer 的文档。

    _testOglView = [[NSView alloc]initWithFrame:[self.view bounds]];
    [_testOglView setLayer:[[TestOpenGLLayer alloc] init]];
    [_testOglView setWantsLayer:YES];
    [self.view addSubview:_testOglView];
    

    在我的 TestOpenGLLayer 类中,我只需要定义 drawInOpenGLContext 函数。我向其中添加了我的 openNGL 命令,并且视图正确地渲染了图层。我不必调用 [layer setContext]。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 2013-03-01
      • 2016-08-02
      相关资源
      最近更新 更多