1
我正在學習金屬和可可,並試圖做一個樣板應用程序作爲未來實驗的平臺。作爲這個過程的一部分,我正在實現一個視圖,它將以60fps的速度重繪自己(或者更準確地說,它的CAMetalLayer
的內容)。也爲了教育目的我避免MTKView
(「學習可可部分」)。以下是我如何解決問題的縮寫代碼片段:正確的方法,使連續重繪金屬NSView
@implementation MyMetalView // which is a subclass of NSView
- (BOOL) isOpaque {
return YES;
}
- (NSViewLayerContentsRedrawPolicy) layerContentsRedrawPolicy {
return NSViewLayerContentsRedrawOnSetNeedsDisplay;
}
- (CALayer *) makeBackingLayer {
// create CAMetalLayer with default device
}
- (BOOL) wantsLayer {
return YES;
}
- (BOOL) wantsUpdateLayer {
return YES;
}
- (void) displayLayer:(CALayer *)layer {
id<MTLCommandBuffer> cmdBuffer = [_commandQueue commandBuffer];
id<CAMetalDrawable> drawable = [((CAMetalLayer *) layer) nextDrawable];
[cmdBuffer enqueue];
[cmdBuffer presentDrawable:drawable];
// rendering
[cmdBuffer commit];
}
@end
int main() {
// init app, window and MyMetalView instance
// invocation will call [myMetalViewInstance setNeedsDisplay:YES]
[NSTimer scheduledTimerWithTimeInterval:1./60. invocation:setNeedsDisplayInvokation repeats:YES];
[NSApp run];
return 0;
}
這是正確的方式來做我想做的事嗎?或者我選擇了一個很長而不被推薦的方法?
我可以直接在MyDisplayLinkCallback中調用我的渲染代碼嗎? –
我個人會將我的圖畫留在我的'updateLayer'實現或'updateLayer'所調用的方法中。最好是使用回調函數作爲反彈回視圖實現的一種方式,而不是在整個類實現和回調(在更大程度上超過必要)的情況下分解視圖的代碼。 – warrenm
我的意思是從回調而不是'setNeedsDisplay:YES'調用視圖的'updateLayer'。如果我理解正確,'setNeedsDisplay:YES'只有**時間表**視圖將來有時重新繪製,這會引入額外的延遲,不是嗎? –