更新Apple的LayerBackedOpenGLView示例以获得高分辨率

时间:2014-12-13 19:11:10

标签: macos opengl core-animation

当我在高分辨率显示器上运行LayerBackedOpenGLView示例时,OpenGL上下文不会以高分辨率呈现(图层的contentScale为1.0)。

我已按照Apple documentation中的步骤操作,但contentScale仍为1.0。

具体来说,我原本以为在MyOpenGLView的init方法中添加以下内容会给我一个高分辨率的层:

[self  setWantsBestResolutionOpenGLSurface:YES];

但是contentScale仍然是1.0。

更新示例以高分辨率渲染OpenGL所需的步骤是什么?

1 个答案:

答案 0 :(得分:1)

我能够获得适当的内容比例。

我在self.wantsLayer = YES中添加了-[MyOpenGLView init]。虽然这是在-[MainController awakeFromNib]中设置的,但它似乎还不够早。

我还将以下方法添加到MyOpenGLView

- (void)viewDidChangeBackingProperties
{
  [super viewDidChangeBackingProperties];
  self.layer.contentsScale = self.window.backingScaleFactor;
}

尽管documentation中有以下声明:

,但这仍然是必要的
  

在高分辨率方面,系统会自动调整图层支持的视图。您无需做任何工作即可获得在高分辨率显示器上看起来很棒的内容。

<强>更新

根据Apple开发人员的说法,这是OS X 10.10中的一个已知错误。

  

您好。这是10.10.0中的已知错误。目前,您可以通过将其添加到NSOpenGLView子类来解决此问题(请注意,此代码在旧版Mac OS X上将无害。)很抱歉给您带来不便!

static CGFloat scaleFactorForOpenGLView(NSView *view) {
     if ([view wantsBestResolutionOpenGLSurface]) {
        NSWindow *window = [view window];

        if (window) {
            return [window backingScaleFactor];
        }
    }

    return 1;
}

- (void)viewDidChangeBackingProperties {
    [super viewDidChangeBackingProperties];
    [[self layer] setContentsScale:scaleFactorForOpenGLView(self)];
}

- (CALayer *)makeBackingLayer {
    CALayer *layer = [super makeBackingLayer];
    [layer setContentsScale:scaleFactorForOpenGLView(self)];
    return layer;
}