- [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

我忘记回来了。

这是 fixedOSX Beta 4nextDrawable 方法工作正常并传回可用的 CAMetalDrawable 对象。我想我应该等到发布版本出来后再发布这个。我只是想让其他人在 Beta 版本首次发布时就知道这个问题。

使用 @autoreleasepool 在 drawable 中渲染。

https://forums.developer.apple.com/thread/15102