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'只有**时间表**视图将来有时重新绘制,这会引入额外的延迟,不是吗? –