macos - OpenGL 无法在 macOS Mojave 上渲染
问题描述
如果您在 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),但它们看起来真的很老套且不可靠。
解决方案
我反汇编了 Apple 的框架,发现它们改变了 OpenGL 渲染在 Mojave 上的工作方式。似乎即使您通过将NSView
's设置wantsLayer
为禁用分层支持NO
,NSView
仍然会创建图层并将其附加到您在 Mojave 上的视图中。在渲染到它之前调整窗口大小是可行的,因为这通常会导致调用[NSOpenGLContext update]
. 调用更新两次是有效的,因为在第一帧NSView
中没有附加任何图层,并且更新方法除了在第二帧上什么都不做,图层就在那里并且[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 上运行([NSView setLayer:]
在 macOS 10.13 和旧版本上不被调用)。这是我为 Ouzel 引擎所做的完整提交:https ://github.com/elnormous/ouzel/commit/7e708636189d970bad6b013ecd5375cfe693f3f3
推荐阅读
- javascript - 移动导航在 Safari 上无法正常工作
- spring-boot - refreshAfterWrite 需要 Spring Boot 咖啡因应用程序中的 LoadingCache
- linux - python setup.py egg_info" 失败,错误代码 1 在 /tmp/pip-build-zsm7incx/phonenumbers/ - 失败
- bi-publisher - 如何在 BI Publisher 中添加复选框?
- javascript - 返回总和为给定值的所有子集(子集和问题)
- python - Django - 通用 ModelAdmin 定义
- android - 在 Hexagon DSP 上运行 Tensorflow Lite 演示模型
- python - Pyspark:如何从 HDFS 访问 XML 文件并使用 Pyspark/Python 读取 XML 文件
- azure - Azure AKS 网络分析 - 这些请求来自 Kubernetes 集群的何处?
- r-markdown - R Markdown - 并排定位表和绘图