- OSX 10.11 Beta 2上的[CAMetalLayer nextDrawable]问题

时间:2015-07-02 15:11:30

标签: macos beta metal

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

我尝试了两种不同的方法来配置设置。一,我使用MTKView并使用其CAMetalLayer,它没有用。其次,使用了NSView并创建了新的CAMetalLayer。那也没有用。我有奇怪的问题。

我想知道其他人是否遇到此问题,如果有人知道解决此问题的解决方案。

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

更新

我重新路由我的drawable调用以使用MTKViewDelegate委托。从drawInView委托方法,我能够检索一致的可绘制框架。 但是,我仍然希望直接使用nextDrawable CAMetalLayer方法。希望这有助于其他任何人。

3 个答案:

答案 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进行渲染。

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

答案 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); } }); fixedOSX Beta 4方法正常工作并传回可用的nextDrawable对象。我想我应该等到发布版本发布之后再发布。当测试版首次发布时,我只想让其他人知道这个问题。