macOS MojaveでNSView
とカスタムを作成した場合NSOpenGLContext
、ウィンドウはサイズ変更されるまでレンダリングされません。しかし、NSOpenGLView
代わりに使用すればすべてが機能します。ウィンドウをプログラムでサイズ変更する(http://people.bath.ac.uk/abscjkw/ComputerPrograms/C++programs/OpenGL/MojaveOpenGL.cpp)、レンダリングする前、または[NSOpenGLContext update]
2回呼び出す(https://)ハックがたくさんあります。 github.com/go-gl/glfw/pull/229/commits/9e6129a572227a13ff9acb4904443d2ae7d66e77)、しかしそれらは本当にハッキーで信頼できないようです。
Appleのフレームワークを逆アセンブルしたところ、MojaveでのOpenGLレンダリングの動作が変更されていることがわかりました。それは設定しても、あなたであれば無効に層状のバッキングと思われるNSView
のwantsLayer
にNO
、NSView
まだ作成され、モハーベ上のビューに層を付加します。レンダリングする前にウィンドウのサイズを変更すると、通常はが呼び出されるため、機能し[NSOpenGLContext update]
ます。最初のフレームにNSView
はレイヤーがアタッチされておらず、updateメソッドは2番目のフレームでしか機能しないため、更新を2回呼び出すと機能し[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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加