Получение сообщения об ошибке "[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.