Я разобрал фреймворки 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