1

我只需要同时渲染多个对象。但我收到一个错误作为提及。在这里,我将多个对象传递给我的渲染函数。

 var sceneObject:Array<Node> = [objectToDraw,temObjectToDraw] 

       for scene in sceneObject{

                  scene .render(commandQueue: commandQueue, pipelineState: pipelineState, drawable: drawable,viewportSize:viewPortSize, clearColor: nil/*,texture: texture*/)
                }

其中render()类如下

 func render(.....) {  
    ...  
    commandBuffer.present(drawable)
    commandBuffer.commit()
    }  

但我收到日志错误消息:

[CAMetalLayerDrawable 纹理] 不应在已呈现此可绘制对象后调用。取而代之的是 nextDrawable 。

有人有线索吗?

4

2 回答 2

1

我最近遇到了这个。就我而言,问题在于该MTKView.draw()命令是在与缓冲区设置不同的线程上执行的。我一直在分派到后台线程做一些核心图像工作,然后分派回主线程进行绘制(因为MTKView从主线程继承UIView并且不能安全地从主线程调用)。

于 2020-11-15T16:19:49.140 回答
0

以下是我修改后的代码,没有错误提示【CAMetalLayerDrawable present】在已经呈现这个drawable之后不应该被调用。换个nextDrawable吧】,希望对你有帮助。

-(void)startRender()  {         
       dispatch_block_t renderBlock = ^ { @autoreleasepool {
          ......
          ......
          id<MTLTexture> drawingTexture =  metalView.currentDrawable.texture;
          ......
          passDescriptor.colorAttachments[0].texture = drawingTexture;
          ......
          ......
          [renderEncoder popDebugGroup];
          [renderEncoder endEncoding];
          [commandBuffer presentDrawable:[(CAMetalLayer*)metalView.layer.nextDrawable]];
          [commandBuffer commit];
       }};

      ([NSThread isMainThread])?renderBlock():dispatch_async(dispatch_get_main_queue(), renderBlock);
}

渲染前可能在其他后台线程,GPU开始渲染时,使用了dispatch_async(get_main),确保渲染在主线程中工作。

显示错误提示是因为:commandBuffer调用presentDrawable时需要传递“metalView.layer.nextDrawable”参数而不是“metalView.currentDrawable”参数。

于 2021-05-26T05:47:53.303 回答