Elv*_*ins 5 opengl macos nsview nsopenglview nsopengl
如果您在macOS Mojave上创建NSView和自定义NSOpenGLContext,则在调整窗口大小之前不会渲染窗口。但是,如果您NSOpenGLView改为使用,则一切正常。我看到很多的程序调整窗口的大小黑客(的http://people.bath.ac.uk/abscjkw/ComputerPrograms/C++programs/OpenGL/MojaveOpenGL.cpp渲染到它或调用之前)[NSOpenGLContext update]两次(https://开头github.com/go-gl/glfw/pull/229/commits/9e6129a572227a13ff9acb4904443d2ae7d66e77),但它们似乎确实很笨拙且不可靠。
我拆解了苹果的框架,发现它们已经改变了OpenGL渲染在Mojave上的工作方式。看来,即使你通过设置禁止分层后盾NSView的wantsLayer到NO,NSView还是创建和附加一个层上莫哈韦你的看法。在渲染窗口之前调整窗口大小是可行的,因为通常会导致对的调用[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
Run Code Online (Sandbox Code Playgroud)
我对其进行了测试,它在Mojave和旧版本的macOS上均可工作([NSView setLayer:]在macOS 10.13和旧版本上未调用)。这是我对Ouzel引擎所做的完整提交:https : //github.com/elnormous/ouzel/commit/7e708636189d970bad6b013ecd5375cfe693f3f3
| 归档时间: |
|
| 查看次数: |
1370 次 |
| 最近记录: |