Получение сообщения об ошибке "[CAMetalLayerDrawable texture] не следует вызывать после того, как вы уже представили этот чертеж. Вместо этого получите nextDrawable".

Мне просто нужно визуализировать несколько объектов одновременно. Но я получаю сообщение об ошибке. Здесь я передаю несколько объектов в функцию рендеринга.

 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 texture] не должен вызываться после того, как он уже представлен. Вместо этого получите nextDrawable.

У кого-нибудь есть подсказка?

2 ответа

Я столкнулся с этим недавно. В моем случае проблема заключалась в том, что MTKView.draw()команда выполнялась в потоке, отличном от настроенного буфера. Я отправлял фоновый поток для выполнения некоторой работы с Core Image, а затем отправлял обратно в основной поток для рисования (поскольку MTKView наследуется от UIView и не может быть безопасно вызван из основного потока).

Ниже приведен мой измененный код, никаких подсказок по ошибкам 【CAMetalLayerDrawable present] не должен вызываться после того, как этот объект рисования уже был представлен. Вместо этого возьмите 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);
}

Он может быть в других фоновых потоках перед рендерингом, когда графический процессор запускает рендеринг, используя dispatch_async (get_main), убедитесь, что рендеринг работает в основном потоке.

Показывать подсказки об ошибках, потому что: Вам нужно передать "metalView.layer.nextDrawable" вместо параметров "metalView.currentDrawable", когда commandBuffer вызывает presentDrawable.

Другие вопросы по тегам