Я пытаюсь переместить свое приложение на основе NSView, чтобы начать использовать графический процессор с 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.
- Должно ли это быть ПУСТО (NULL) для NSViews с поддержкой слоя?
Я также попытался выяснить, где в предыдущей реализации генерировался NSGraphicsContext
, и, как оказалось, мое приложение нигде не устанавливало его. NSView
сам устанавливал NSGraphicsContext
где-то внутри displayIfNeeded
, перед тем как вызвать drawRect
.
- Могу ли я по-прежнему использовать NSGraphicsContext для рендеринга в NSView, даже если он поддерживается слоем?
Спасибо!