- [CAMetalLayer nextDrawable] OSX 10.11 Beta 2 问题
- [CAMetalLayer nextDrawable] issue on OSX 10.11 Beta 2
每当我将 CAMetalLayer
添加到 NSView
时,[CAMetalLayer nextDrawable]
方法将在 3 次成功 id<CAMetalDrawable>
后通过 nil
。
我尝试了两种不同的方法来配置设置。一,我用了MTKView,用了它的CAMetalLayer
,没用。其次,使用 NSView
并创建新的 CAMetalLayer
。那也没有用。我遇到了奇怪的问题。
我想知道其他人有这个问题,如果有人知道解决这个问题的方法。
补充说明:
我不想通过重写它的方法来使用 MTKView 绘图系统(还没有)。这在 iOS 8 上也不是问题,我没有在 iOS 9 的测试版中尝试我的代码(还没有)。
更新
我重新路由我的可绘制调用以使用 MTKViewDelegate
委托。从 drawInView
委托方法中,我能够检索到一致的可绘制框架。 不过,我还是想直接从CAMetalLayer
使用nextDrawable
的方法。希望这对其他人有帮助。
我遇到了同样的问题,并在 WWDC 15 上询问了 Metal 开发人员。
MTKView
的工作原理:MTKView
的可绘制对象数量有限(可能是 3 个),因此当您对帧进行编码时,您可以使用的可绘制对象很少画到。
你在做什么:你的场景可能很简单,所以你CPU可以非常快地编码帧。所以看起来,当 CPU 比 GPU 快 4 帧时,您要求下一个可绘制对象,并且由于所有 (3) 个可绘制对象都在使用中,所以它失败了。
解决方法: 没有时需要使用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项目模板(文件 -> GameViewController
.
中的新建 -> 项目 -> 游戏 -> 选择金属)
我已经对此进行了调查(尚未回复),如果您也这样做,我将不胜感激https://bugreport.apple.com
您可能还会发现我的 github 存储库有用 https://github.com/haawa799/RamOnMetal
我忘记回来了。
这是 fixed
和 OSX Beta 4
。 nextDrawable
方法工作正常并传回可用的 CAMetalDrawable
对象。我想我应该等到发布版本出来后再发布这个。我只是想让其他人在 Beta 版本首次发布时就知道这个问题。
使用 @autoreleasepool
在 drawable 中渲染。
每当我将 CAMetalLayer
添加到 NSView
时,[CAMetalLayer nextDrawable]
方法将在 3 次成功 id<CAMetalDrawable>
后通过 nil
。
我尝试了两种不同的方法来配置设置。一,我用了MTKView,用了它的CAMetalLayer
,没用。其次,使用 NSView
并创建新的 CAMetalLayer
。那也没有用。我遇到了奇怪的问题。
我想知道其他人有这个问题,如果有人知道解决这个问题的方法。
补充说明:
我不想通过重写它的方法来使用 MTKView 绘图系统(还没有)。这在 iOS 8 上也不是问题,我没有在 iOS 9 的测试版中尝试我的代码(还没有)。
更新
我重新路由我的可绘制调用以使用 MTKViewDelegate
委托。从 drawInView
委托方法中,我能够检索到一致的可绘制框架。 不过,我还是想直接从CAMetalLayer
使用nextDrawable
的方法。希望这对其他人有帮助。
我遇到了同样的问题,并在 WWDC 15 上询问了 Metal 开发人员。
MTKView
的工作原理:MTKView
的可绘制对象数量有限(可能是 3 个),因此当您对帧进行编码时,您可以使用的可绘制对象很少画到。
你在做什么:你的场景可能很简单,所以你CPU可以非常快地编码帧。所以看起来,当 CPU 比 GPU 快 4 帧时,您要求下一个可绘制对象,并且由于所有 (3) 个可绘制对象都在使用中,所以它失败了。
解决方法: 没有时需要使用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项目模板(文件 -> GameViewController
.
我已经对此进行了调查(尚未回复),如果您也这样做,我将不胜感激https://bugreport.apple.com
您可能还会发现我的 github 存储库有用 https://github.com/haawa799/RamOnMetal
我忘记回来了。
这是 fixed
和 OSX Beta 4
。 nextDrawable
方法工作正常并传回可用的 CAMetalDrawable
对象。我想我应该等到发布版本出来后再发布这个。我只是想让其他人在 Beta 版本首次发布时就知道这个问题。
使用 @autoreleasepool
在 drawable 中渲染。