在SceneKit场景中,我想从文本文件中加载对象的顶点。之后,我从这些顶点创建SCNGeometry。
要存储位置和颜色信息,我创建了一个名为Vertex
的结构:
struct Vertex {
var x: Float, y: Float, z: Float
}
使用单线程读取数据并将其存储在vertices数组中时,一切工作正常:
// read file as lines of string
var n = totalNumberOfVertices
var lines = data.components(separatedBy: "\n")
// create array for vertices
var vertices = Array(repeating: Vertex(x:0, y:0, z:0), count: n)
// fill vertices array
for i in 0...(n-1) {
let elements = lines[i].components(separatedBy: " ")
vertices[i].x = Float(elements[0])!
vertices[i].y = Float(elements[1])!
vertices[i].z = Float(elements[2])!
}
// create geometry and so on ...
为了提高性能,我想使用 GDS 执行并发for循环。因为所有行都在那里,所以我只需要不同的行索引,即可将数据存储在不同的数组索引中。因此应该可以轻松地将其并行化:
// fill vertices array concurrent
DispatchQueue.concurrentPerform(iterations: n - 1) { (i) in
let elements = lines[i].components(separatedBy: " ")
vertices[i].x = Float(elements[0])!
vertices[i].y = Float(elements[1])!
vertices[i].z = Float(elements[2])!
}
但是现在在设置不同的顶点值(x, y, z
)时总是会出错。该错误告诉我没有释放指针,但是我看不到他在谈论哪种指针。也许我误解了Swift中结构的底层实现。
malloc: *** error for object 0x113190000: pointer being freed was not allocated
有人可以告诉我我在做什么错,因为我不经常写Swift,但是我相信我没有任何可见的(直接在我的代码中)并发问题。
另一个奇怪的事情是:如果获得对struct元素的引用,则无法设置值。结构是否总是返回byval
?也许与这种现象有关。
var vertex = vertices[i]
// this is not working
// vertices[i] is still 0 after that
vertex.x = Float(elements[0])!
vertex.y = Float(elements[1])!
vertex.z = Float(elements[2])!