如果您在macOS Mojave上创建NSView和自定义NSOpenGLContext,则在调整窗口大小之前不会渲染窗口。但是,如果您改用NSOpenGLView,则一切正常。
我看到很多hack,它们会在渲染到窗口之前以编程方式调整窗口大小(http://people.bath.ac.uk/abscjkw/ComputerPrograms/C++programs/OpenGL/MojaveOpenGL.cpp)或两次调用[NSOpenGLContext update](https://github.com/go-gl/glfw/pull/229/commits/9e6129a572227a13ff9acb4904443d2ae7d66e77),但它们看起来确实很hacky并且不可靠。

最佳答案

我拆解了Apple的框架,发现它们已经改变了OpenGL渲染在Mojave上的工作方式。看来,即使通过将NSViewwantsLayer设置为NO来禁用分层支持,NSView仍会在Mojave上创建并将图层附加到 View 上。在渲染窗口之前调整窗口大小是可行的,因为通常会导致对[NSOpenGLContext update]的调用。两次调用更新均有效,因为在第一帧NSView中没有附加任何层,而update方法除了在第二帧上没有任何作用外,在第二层中存在该层,并且[NSOpenGLContext update]实际上初始化了帧缓冲区。

因此,解决方案是每当设置了[NSOpenGLContext update]的层时就手动调用NSView,如下所示:

@interface OpenGLView: ViewMacOS
{
    NSOpenGLContext* _openGLContext;
}
@end

@implementation OpenGLView

-(void)setLayer:(CALayer*)layer
{
    [super setLayer:layer];

    [_openGLContext update];
}

@end

我对其进行了测试,它在Mojave和旧版本的macOS上均可工作(在macOS 10.13和旧版本上未调用[NSView setLayer:])。这是我对Ouzel引擎所做的完整提交:https://github.com/elnormous/ouzel/commit/7e708636189d970bad6b013ecd5375cfe693f3f3

关于macos - OpenGL无法在macOS Mojave上渲染,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52938516/

10-12 01:30