美文网首页
SceneKit之属性的前缀‘simd’的含义

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

作者: 沈枫_ShenF | 来源:发表于2019-05-02 01:47 被阅读0次

    在 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

    Mmo6j.png

    step 2

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

    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’的含义

          本文链接:https://www.haomeiwen.com/subject/mtmgnqtx.html