【发布时间】:2016-06-13 16:18:52
【问题描述】:
我正在学习 Metal 和 Cocoa,并尝试将样板应用程序作为未来实验的平台。作为该过程的一部分,我正在实现一个视图,该视图将以 60fps 重绘自身(或者更准确地说,它的 CAMetalLayer 的内容)。也出于教育目的,我避免使用MTKView(用于“学习可可部分”)。这是我如何解决问题的缩写代码 sn-p:
@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;
}
这是做我想做的事情的正确方法吗?还是我选择了一个长期且不推荐的方法?
【问题讨论】: