Производительность при создании MDLVoxelArray алгоритмически - PullRequest
1 голос
/ 14 июля 2020

Я экспериментировал с функциональностью MDLVoxelArray в iOS, чтобы создать меня sh алгоритмически через воксели.

В настоящее время я создаю массив вокселей следующим образом:

let minBounds = vector_float3(x: 0.0, y: 0.0, z: 0.0)
let maxBounds = vector_float3(x: Float(width), y: Float(height), z: Float(maxDepth))
let boundingBox = MDLAxisAlignedBoundingBox(maxBounds: maxBounds, minBounds: minBounds)
let voxels = MDLVoxelArray(data: Data(capacity: MemoryLayout<MDLVoxelIndex>.size * width * height * depth), boundingBox: boundingBox, voxelExtent: 1.0)

Затем я заполняю его индексами:

var index = MDLVoxelIndex(x: 0, y: 0, z: 0, w: 0)
for i in 0 ..< height {
    for j in 0 ..< width {
        index.x = Int32(j)
        index.y = Int32(i)

        let depth = Int32(heightMap[j][i])
        let midPoint = depth / 2
                
        for k in 0 ... depth {
            // w should be 0 at the surface and increase in magnitude towards the middle
            let w = abs(k - midPoint) - midPoint
            index.z = k
            index.w = w
            voxels.setVoxelAtIndex(index)
        }
    }
}

Позже я затем конвертирую MDLVoxelArray в me sh и сохраняю его в файл USDZ. Он работает (и дает довольно хорошие результаты, на самом деле), но он очень медленный и становится все медленнее и медленнее по мере того, как он повторяется все дальше и дальше.

Я нахожу очень мало примеров / небольшую документацию о MDLVoxelArrays онлайн, поэтому мой вопрос:

Правильный ли go способ создания и заполнения массива вокселей? Я просто догадывался, как дать ему начальную емкость при заполнении объекта Data, но мне кажется, что это может быть неверно.

Также приветствуются любые советы о том, как go профилировать, почему это медленно. Я не уверен, какие инструменты доступны для диагностики узких мест производительности, когда они находятся внутри таких внутренних API Apple?

...