【发布时间】:2016-01-19 20:16:33
【问题描述】:
我正在使用 SceneKit 的 SCNParticleSystem 构建一个测试应用程序。它有一个回调,可让您修改每一帧上的粒子属性。这个回调的签名是
typealias SCNParticleModifierBlock = (UnsafeMutablePointer<UnsafeMutablePointer<Void>>, UnsafeMutablePointer<Int>, Int, Int, Float) -> Void
来自苹果开发者网站的参考 - SCNParticleSystem_Class
我不知道如何从 Swift 访问和修改此引用。如果这是 C,那将是一个 **,我可以像数组一样取消引用。
经过一番折腾,我已经做到了这一点:
.....
particleSystem?.addModifierForProperties([SCNParticlePropertySize], atStage: SCNParticleModifierStage.PostDynamics, withBlock: doit2)
}
struct Foos {
var size:float_t
}
func doit2(data:UnsafeMutablePointer<UnsafeMutablePointer<Void>>, dataStride: UnsafeMutablePointer<Int>, start:Int, end:Int, deltaTime:Float) -> Void {
let myptr = UnsafeMutablePointer<UnsafeMutablePointer<Foos>>(data)
print("indexes",start,end)
for i in 0 ..< end {
print(i,myptr[i].memory.size)
}
}¸
这适用于第一个粒子,但在第二个粒子上崩溃。第一次调用该函数时有 0 个粒子,因此它跳过了循环。第二次有三个粒子,所以它试图将它们打印出来。第一个尺寸值为 0.9,接缝合理。第二个大小值显然是伪造的,然后它崩溃了,我掉进了调试器。
indexes 0 0
indexes 0 3
0 0.929816
1 1.51296e-39
(lldb)
据我所知,互联网上没有人使用此功能。我找到的唯一参考资料是 Apple 的文档,它只提供了 ObjC 示例,而不是 Swift。
帮帮我!
【问题讨论】:
-
叫我疯了,但既然这是一个指向指针的指针,你不应该用它的
memory.memory来达到真实的东西吗? -
好点。切换到
myptr.memory[i].size让我更接近,但它仍然时不时地崩溃。如果我设置了大小,那么我可以看到一些但不是所有的粒子都在变化。而那些确实发生变化的人会被卡住,他们会停止移动。这表明我正在破坏一些记忆。而且我仍然不确定 dataStride 的用途。文档说它应该是:“数组标识每个粒子的数据条带中每个属性值的偏移量(以字节为单位)。此数组中偏移量的顺序对应于 addModifierForProperties 调用中属性数组的顺序跨度> -
我应该提一下,在 ObjC 示例代码中使用了 dataStride,但我看不到在 Swift 版本中如何使用它。
-
我从来没有使用过这个 API,所以我不知道。我很想说:嘿,让我们只在这一部分代码中使用 Objective-C。将其简化为先前已解决的问题,知道我的意思吗? :)