Обмен текстур в металле с помощью командного кодера Blit - PullRequest
0 голосов
/ 31 января 2020

Недавно я реализовал симуляцию воды в металле, используя буфер для пинг-понга и вычислительные шейдеры. Это работает хорошо, но мне просто интересно, какова будет стоимость замены текстур несколько раз за кадр и можно ли это улучшить, используя Blit Command Encoder?

Вот пример кода:

    let computeEncoder = commandBuffer.makeComputeCommandEncoder()!
    computeEncoder.setComputePipelineState(pipelineState)
    computeEncoder.setTexture(textureA, index: 0)
    computeEncoder.setTexture(textureB, index: 1)

    var width = pipelineState.threadExecutionWidth
    var height = pipelineState.maxTotalThreadsPerThreadgroup / width
    let threadsPerThreadGroup = MTLSizeMake(width, height, 1)
    width = Int(textureA.width)
    height = Int(textureA.height)
    let threadsPerGrid = MTLSizeMake(width, height, 1)

    computeEncoder.dispatchThreads(threadsPerGrid, threadsPerThreadgroup: threadsPerThreadGroup)
    computeEncoder.endEncoding()

    swap(&textureA, &textureB)

1 Ответ

0 голосов
/ 02 февраля 2020

Этот метод работает хорошо:

    let blitEncoder = commandBuffer.makeBlitCommandEncoder()

    blitEncoder?.copy(from: textureA, to: temp)
    blitEncoder?.copy(from: textureB, to: textureA)
    blitEncoder?.copy(from: temp, to: textureB)

    blitEncoder?.endEncoding()

Я не проводил никаких тестов, чтобы увидеть, если это улучшает производительность, хотя я предполагаю, что это делает. Буду публиковать результаты, как только у меня будет!

...