Вызывается CAMetalLayer nextDrawable раньше, чем необходимо - PullRequest
0 голосов
/ 17 июня 2019

Предупреждение о захвате кадра графического процессора:

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.

Есть ли способ запросить текущую отрисовку, когда это необходимо, и отключить предупреждение?

1 Ответ

0 голосов
/ 17 июня 2019

Вы звоните view.currentRenderPassDescriptor вверху кода, который вы перечислили.Дескриптор прохода рендеринга должен иметь ссылку на текстуру рисованного объекта в виде цветового вложения.Это подразумевает получение drawable и запрос его текстуры.Таким образом, эта строка запрашивает рисование.

Не получайте дескриптор прохода рендеринга до тех пор, пока вы не создадите кодировщик команды рендеринга (let renderTexture = commandBuffer.makeRenderCommandEncoder(descriptor: descriptor)) с его использованием.

...