SceneKit之属性的前缀‘simd’的含义

SceneKit之属性的前缀‘simd’的含义_第1张图片

在 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执行了以下两项操作:

  1. load x0 and x1 in memory and add them
  2. load y0 and y1 in memory and add them

如下图所示:

step 1

SceneKit之属性的前缀‘simd’的含义_第2张图片
Mmo6j.png

step 2

SceneKit之属性的前缀‘simd’的含义_第3张图片
KaEhb.png

现在我们看看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加载到内存,然后将他们相加,如图:

SceneKit之属性的前缀‘simd’的含义_第4张图片
tb3Pf.png

可以看出,x 和 y 的各部分的操作是同时进行的。由此可见它比一般用法更加高效。

再来看看 SceneKit 中 position 和 simdPosition 的一个例子,你就能明白他们的不同之处了。

我们将某个场景中的各子节点的坐标值都加10:

  1. 使用position
for node in scene.rootNode.childNodes {
    node.position.x += 10
    node.position.y += 10
    node.position.z += 10
}

执行完for循环,总共需要执行childNodes.count * 3 次操作。

  1. 使用simdPosition
let delta = simd_float3(10) //定义一个x,y,z 都是10的向量
for node in scene.rootNode.childNodes {
    node.simdPosition += delta
}

第二种执行了childNodes.count次,明显比第一种速度要快,效率要高。
因此,如果需要对不同的值执行多次相同的操作,可以使用SIMD属性。

你可能感兴趣的:(SceneKit之属性的前缀‘simd’的含义)