Предупреждение о захвате кадра графического процессора:
your application called CAMetalLayer nextDrawable earlier than needed
Я звоню present(drawable)
после того, как все мои другие вызовы GPU были сделаны, непосредственно перед фиксацией буфера команд
guard let commandBuffer = commandQueue.makeCommandBuffer(),
let computeBuffer = commandQueue.makeCommandBuffer(),
let descriptor = view.currentRenderPassDescriptor else { return }
...
//First run the compute kernel
guard let computeEncoder = computeBuffer.makeComputeCommandEncoder() else { return }
computeEncoder.setComputePipelineState(computePipelineState)
dispatchThreads(particleCount: particleCount)
computeEncoder.endEncoding()
computeBuffer.commit()
//I need to wait here because I need values from a computed buffer first
//and also why I am not just using a single pipeline descriptor
computeBuffer.waitUntilCompleted()
//Next render computed particles with vertex shader to a texture
let renderEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: descriptor0)!
renderEncoder.setRenderPipelineState(renderPipelineState)
...
renderEncoder.endEncoding()
//Draw texture (created above) using vertex shader:
let renderTexture = commandBuffer.makeRenderCommandEncoder(descriptor: descriptor)
renderTexture?.setRenderPipelineState(renderCanvasPipelineState)
...
renderTexture?.endEncoding()
//Finally present drawable and commit command buffer:
guard let drawable = view.currentDrawable else { return }
commandBuffer.present(drawable)
commandBuffer.commit()
Я не вижу, как можно запросить currentDrawable позже. Я делаю что-то неправильно или неоптимально?
Я начал изучать проблему, потому что в большинстве кадров (в основном это одно и то же) ожидание текущей отрисовки составляет около 3-10 мс. Время от времени ожидания составляет 35-45мс.
Я вижу ряд рекомендаций по использованию presentDrawable
вместо present
, но это не похоже на вариант со Swift.
Есть ли способ запросить текущую отрисовку, когда это необходимо, и отключить предупреждение?