设置CAMetalLayer后,NSGraphicsContext变为NULL

时间:2018-10-31 11:11:36

标签: macos calayer nsview metal

我试图移动基于NSView的应用程序以开始将GPU与Metal一起使用。因此,我像这样添加了CAMetalLayer

[self setWantsLayer:YES];
self.layerContentsRedrawPolicy = NSViewLayerContentsRedrawDuringViewResize;

并像这样制作衬里层:

- (CALayer*)makeBackingLayer
{
    id <MTLDevice> device = MTLCreateSystemDefaultDevice();
    CAMetalLayer *backingLayer   = [CAMetalLayer layer];
    backingLayer.opaque          = YES;
    backingLayer.device          = device;
    backingLayer.pixelFormat     = MTLPixelFormatBGRA8Unorm;
    backingLayer.framebufferOnly = YES;

    [backingLayer setDelegate:self];
    return backingLayer;
}

我在CustomNSView类中编写所有这些代码是从CustomParentNSView类继承的,该类使用NSGraphicsContext在屏幕上绘制一些东西。现在,由于我将CustomNSView移到支持NSView的图层上,因此当我尝试调用时:

[NSGraphicsContext currentContext]

这将返回NULL。

  1. 对于层支持的NSViews,它应该为NULL吗?

我还尝试调查了在以前的实现NSGraphicsContext中生成的位置,结果发现,我的应用程序无处设置它。 NSView本身是在调用NSGraphicsContext之前从displayIfNeeded内部的某个地方设置drawRect

  1. 即使层支持,我仍可以使用NSGraphicsContext渲染到NSView吗?

谢谢!

0 个答案:

没有答案