3

每当我添加CAMetalLayer到 时NSView,该[CAMetalLayer nextDrawable]方法将nil在 3 成功后通过id<CAMetalDrawable>

我尝试了两种不同的方法来配置设置。一,我用过MTKView,用过它的CAMetalLayer,没用。第二,使用NSView和创造新的CAMetalLayer。那也没用。我有奇怪的问题。

我想知道其他人有这个问题,如果有人知道解决这个问题的方法。

附加说明:
我不想通过覆盖其方法(尚未)来使用 MTKView 绘制系统。这在 iOS 8 上也不是问题,我没有在 iOS 9 的 beta 版本中尝试过我的代码(还没有)。

更新

我重新路由我的可绘制调用以使用MTKViewDelegate委托。通过drawInView委托方法,我能够检索到一致的可绘制框架。不过,我还是想nextDrawable直接用方法从CAMetalLayer。希望这对其他人有帮助。

4

3 回答 3

4

我遇到了同样的问题,并在WWDC 15上询问了Metal开发人员。

MTKView工作原理:MTKView绘制对象的数量有限(可能是 3 个),因此当您对帧进行编码时,可以绘制的可绘制对象很少。

你在做什么:你的场景可能很简单,所以你的 CPU 可以非常快地编码帧。所以看起来,当 CPU 比 GPU 领先 4 帧时,您要求下一个可绘制对象,并且由于所有 (3) 个可绘制对象都在使用中,所以它失败了。

解决方案:当没有空闲的时候,你需要使用信号量等待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()
    }

这在任何地方都没有记录!唯一书面提及的是在GameViewController.

我已经对此进行了调查(还没有回复),如果您也这样做,我将不胜感激https://bugreport.apple.com

您也可能会发现我的 github 存储库https://github.com/haawa799/RamOnMetal很有用

于 2015-07-03T10:44:39.180 回答
0

用于@autoreleasepool在drawable中渲染。

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

于 2016-01-14T05:25:45.810 回答
-1

我忘了回到这个。

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

于 2015-09-19T17:40:42.720 回答