每当我将CAMetalLayer
添加到NSView
时,[CAMetalLayer nextDrawable]
方法会在成功nil
成功后通过id<CAMetalDrawable>
。
我尝试了两种不同的方法来配置设置。一,我使用MTKView并使用其CAMetalLayer
,它没有用。其次,使用了NSView
并创建了新的CAMetalLayer
。那也没有用。我有奇怪的问题。
我想知道其他人是否遇到此问题,如果有人知道解决此问题的解决方案。
附加说明:
我不想通过覆盖其方法(尚未)来使用MTKView绘图系统。这也不是iOS 8上的问题,我没有尝试使用iOS 9的beta版本(尚未)。
更新
我重新路由我的drawable调用以使用MTKViewDelegate
委托。从drawInView
委托方法,我能够检索一致的可绘制框架。 但是,我仍然希望直接使用nextDrawable
CAMetalLayer
方法。希望这有助于其他任何人。
答案 0 :(得分:3)
我遇到了同样的问题,并在 WWDC 15 上询问金属开发者。
MTKView
如何运作:MTKView
的抽奖数量有限(可能为3),因此当您对帧进行编码时,您可以绘制的抽签数量很少。
你在做什么:你的场景可能非常简单,所以你可以非常快速地编码帧。所以看起来,当CPU比GPU提前4帧时,你要求下一个drawable,因为所有(3)drawable都在使用,它就会失败。
解决方案:您需要使用 semapthore ,以便在没有免费的时候等待drawable。
以下是使用的代码:
let inflightSemaphore = dispatch_semaphore_create(3)
func drawInView(view: MTKView) {
// use semaphore to encode 3 frames ahead
dispatch_semaphore_wait(inflightSemaphore, DISPATCH_TIME_FOREVER)
self.update()
let commandBuffer = commandQueue.commandBuffer()
let renderEncoder = commandBuffer.renderCommandEncoderWithDescriptor(view.currentRenderPassDescriptor!)
renderEncoder.drawPrimitives()
// use completion handler to signal the semaphore when this frame is completed allowing the encoding of the next frame to proceed
commandBuffer.addCompletedHandler{ [weak self] commandBuffer in
if let strongSelf = self {
dispatch_semaphore_signal(strongSelf.inflightSemaphore)
}
return
}
commandBuffer.presentDrawable(view.currentDrawable!)
commandBuffer.commit()
}
这在任何地方都没有记录!唯一的书面提及是 iOS项目模板(文件 - &gt;新 - &gt;项目 - &gt;游戏 - &gt ;选择金属)在GameViewController
。
我已经填写了这方面的雷达(尚未回复),如果你这样做,我将不胜感激https://bugreport.apple.com
你也可以找到有用的我的github回购https://github.com/haawa799/RamOnMetal
答案 1 :(得分:0)
在drawable中使用@autoreleasepool
进行渲染。
答案 2 :(得分:-1)
我忘了回到这里。
这是l.add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int i= Integer.parseInt(l.input1.getText().toString());
int j= Integer.parseInt(l.input2.getText().toString());
int sum = i+j;
l.result.setText(sum);
}
});
fixed
。 OSX Beta 4
方法正常工作并传回可用的nextDrawable
对象。我想我应该等到发布版本发布之后再发布。当测试版首次发布时,我只想让其他人知道这个问题。