Я экспериментировал с функциональностью 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?