добавить данные к существующему содержимому MTLBuffer в Metal - PullRequest
0 голосов
/ 01 июня 2018

Как добавить данные в MTLBuffer?

У меня есть следующий набор данных:

var verticesArray:Array<Vertex>  = [
                A,B,C ,D,E,F
            ]

, и я создаю vertexBuffer (MTLBuffer), который может хранить несколько массивов вершин

var vertexData = Array<Float>()
    for vertex in vertices{
        vertexData += vertex.floatBuffer()
    }

    let dataSize = 1000*vertexData.count * MemoryLayout.size(ofValue: vertexData[0])
    vertexBuffer = device.makeBuffer(bytes: vertexData, length: dataSize, options: [])

Мне нужно добавить в vertexBufferдругой набор вершин следующим образом.

var verticesArray2:Array<Vertex>  = [
                    G,H,I ,J,K,L
                ]

Как я могу добавить?Нужна помощь.

1 Ответ

0 голосов
/ 20 июня 2018

Металлический буфер равен , а не a, как Swift Array, Obj C NSMutableArray или C ++ STL vector.Для буфера есть фиксированная память, поэтому вы не можете изменить его размер, чтобы добавить / добавить больше данных.

Вместо этого вам нужно будет создать новый буфер, достаточно большой, чтобы соответствовать данным существующего массива и новым элементамВы хотите добавить, а затем скопировать их в новый расширенный буфер.Поскольку создание буфера и копирование обходятся дорого, лучше создавать дополнительные места каждый раз, когда вы создаете новый буфер, так что вы можете «добавлять» много раз, не создавая новый буфер и не копируя каждый раз.Кроме того, если данные находятся на графическом процессоре в другом буфере, вы должны использовать MTLBlitCommandEncoder для выполнения операций копирования в расширенный буфер.

Мне интересно, что вы в конечном итоге пытаетесь выполнить с этим буфером, так какэто может быть не очень хорошее использование металла.

...