2

私たちのシーンには約 20 個のノードしかありません。以下のコードにより、ユーザーはパンを実行し、各パンでヒット テストを実行できます。目標は、ユーザーが画面をパンするときにブロックを強調表示することです。

ただし、iPhone 5S では著しく遅くなります。それは決定論的ではありませんが、イライラするほど頻繁に発生します(5〜10回のパンごと)。

テストの範囲を厳密に制限できるため、使用を検討しhitTestWithSegmentましたが、関数に必要な 2 つのポイントを最初に計算する必要があるため、遅くなるはずです。

さらに、 のSCNHitTestClipToZRangeKeyオプションはhitTest、2 つの追加ポイントの計算を必要とせずにヒット範囲を狭めることによって、同等のパフォーマンスの向上を提供する必要があります。

のパフォーマンスを高速化するための提案はありhitTestますか?

func sceneViewPannedOneFinger(sender: UIPanGestureRecognizer) {
    // Get pan distance & convert to radians
    let translation = sender.translationInView(sender.view!)
    var xRadians = GLKMathDegreesToRadians(Float(translation.x))
    var yRadians = GLKMathDegreesToRadians(Float(translation.y))

    // Get x & y radians
    xRadians = (xRadians / 4) + curXRadians
    yRadians = (yRadians / 4) + curYRadians

    // Limit yRadians to prevent rotating 360 degrees vertically
    yRadians = max(Float(-M_PI_2), min(Float(M_PI_2), yRadians))

    // Set rotation values to avoid Gimbal Lock
    cameraNode.rotation = SCNVector4(x: 1, y: 0, z: 0, w: yRadians)
    userNode.rotation = SCNVector4(x: 0, y: 1, z: 0, w: xRadians)

    // Save value for next rotation
    if sender.state == UIGestureRecognizerState.Ended {
        curXRadians = xRadians
        curYRadians = yRadians
    }

    // Set preview block
    setPreviewBlock(sender)
}


private func setPreviewBlock(recognizer: UIGestureRecognizer) {        
    let point = recognizer.locationInView(sceneView)
    let options = [SCNHitTestRootNodeKey: sceneView.scene!.rootNode, SCNHitTestClipToZRangeKey: 15, SCNHitTestSortResultsKey: true]
    let hits = sceneView.hitTest(point, options: options)
    print(hits.first?.worldCoordinates)
}
4

0 に答える 0