SCNNode(SIMD)
という名前のSCNNode
カテゴリがあり、simdPosition
、simdRotation
などのプロパティを宣言します。これらは元の/通常のプロパティposition
とrotation
の重複したプロパティのようです。
@property(nonatomic) simd_float3 simdPosition API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0));
@property(nonatomic) simd_float4 simdRotation API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0));
position
とsimdPosition
の違いは何ですか?接頭辞「simd」は正確にはどういう意味ですか?
SIMD命令を使用すると、複数の値に対して同じ操作を同時に実行できます。
例を見てみましょう
4つのInt32値があります
let x0: Int32 = 10
let y0: Int32 = 20
let x1: Int32 = 30
let y1: Int32 = 40
2 x
と2 y
の値を合計したいので、
let sumX = x0 + x1 // 40
let sumY = y0 + y1 // 60
以前の2つのsums
を実行するには、CPUは
- x0とx1をメモリにロードして追加する
- y0とy1をメモリにロードして追加する
したがって、結果は2つの演算で得られます。
私はあなたにアイデアをよりよく示すためにいくつかのグラフィックを作成しました
ステップ1
ステップ2
SIMDがどのように機能するかを見てみましょう。まず、適切なSIMD形式で保存された入力値が必要です。
let x = simd_int2(10, 20)
let y = simd_int2(30, 40)
ご覧のとおり、前のx
とy
はベクトルです。実際、x
とy
の両方に2つのコンポーネントが含まれています。
今書くことができます
let sum = x + y
前の操作を実行するためにCPUが何をするか見てみましょう
- メモリにxとyをロードして追加する
それでおしまい!
x
の両方のコンポーネントとy
の両方のコンポーネントは、同時に処理されます。
私たちは[〜#〜]ではありません[〜#〜]並行プログラミングについて話していますが、代わりにこれは本当の並列ですプログラミング。
特定の操作で想像できるように、SIMDのアプローチはシリアルのアプローチよりもはるかに高速です。
シーンキットの例を見てみましょう
追加したい10
を、シーンノードのすべての直接の子孫のx
、y
、およびz
コンポーネントに追加します。
古典的なシリアルアプローチを使用して、
for node in scene.rootNode.childNodes {
node.position.x += 10
node.position.y += 10
node.position.z += 10
}
ここでは合計
childNodes.count * 3
操作が実行されます。
SIMD命令で前のコードを変換する方法を見てみましょう
let delta = simd_float3(10)
for node in scene.rootNode.childNodes {
node.simdPosition += delta
}
このコードは、以前のコードよりもはるかに高速です。 2倍か3倍かはわかりませんが、信じてください。
異なる値に対して同じ操作を数回実行する必要がある場合は、SIMDプロパティを使用するだけです:)
SIMDは、<simd/simd.h>
からインポートできる vector types の上に構築された小さなライブラリです。これにより、より表現力とパフォーマンスの高いコードが可能になります。
たとえば、SIMDを使用すると、次のように記述できます。
simd_float3 result = a + 2.0 * b;
の代わりに
SCNVector3 result = SCNVector3Make(a.x + 2.0 * b.x, a.y + 2.0 * b.y, a.z + 2.0 * b.z);
Objective-Cでは、メソッドをオーバーロードできません。つまり、両方を持つことはできません
@property(nonatomic) SCNVector3 position;
@property(nonatomic) simd_float3 position API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0));
新しいSIMDベースのAPIには別の名前が必要でした。そのため、SceneKitはsimdPosition
を公開しています。