在 SCNNode (SIMD)中,声明了很多带有 ‘simd’ 的属性,如 simdPosition, simdRotation 等,这些跟 SCNNode 原来的position,rotation 属性有什么区别呢?
SIMD: Single Instruction Multiple Data
从字面上看,它是单指令多数据流。SIMD指令允许您同时对多个值执行相同的操作。
让我们看一个例子。
我们定义四个Int32值,如下:
let x0: Int32 = 10
let y0: Int32 = 20
let x1: Int32 = 30
let y1: Int32 = 40
然后分别将x值,y值相加:
let sumX = x0 + x1 // 40
let sumY = y0 + y1 // 60
实际上CPU执行了以下两项操作:
- load x0 and x1 in memory and add them
- load y0 and y1 in memory and add them
如下图所示:
Mmo6j.pngstep 1
KaEhb.pngstep 2
现在我们看看SIMD怎么处理的,首先我们将值以SIMD格式存入:
let x = simd_int2(10, 20)
let y = simd_int2(30, 40)
x, y 都是包含两个元素的向量,将x,y相加:
let sum = x + y
CPU在此过程中只是将x,y加载到内存,然后将他们相加,如图:
tb3Pf.png可以看出,x 和 y 的各部分的操作是同时进行的。由此可见它比一般用法更加高效。
再来看看 SceneKit 中 position 和 simdPosition 的一个例子,你就能明白他们的不同之处了。
我们将某个场景中的各子节点的坐标值都加10:
- 使用position
for node in scene.rootNode.childNodes {
node.position.x += 10
node.position.y += 10
node.position.z += 10
}
执行完for循环,总共需要执行childNodes.count * 3 次操作。
- 使用simdPosition
let delta = simd_float3(10) //定义一个x,y,z 都是10的向量
for node in scene.rootNode.childNodes {
node.simdPosition += delta
}
第二种执行了childNodes.count次,明显比第一种速度要快,效率要高。
因此,如果需要对不同的值执行多次相同的操作,可以使用SIMD属性。
网友评论