2

我们的场景只有大约 20 个节点。下面的代码让用户平移,对每个平移进行命中测试——目标是在用户平移屏幕时突出显示块。

但是,它在 iPhone 5S 上明显迟缓。这不是确定性的,但经常发生足以令人恼火(每 5-10 个平底锅)。

我们考虑使用hitTestWithSegment,因为您可以严格限制测试范围,但认为应该更慢,因为您必须首先计算函数所需的两个点。

此外,该SCNHitTestClipToZRangeKey选项hitTest应该通过收紧命中范围来提供相当的性能提升,而无需计算两个额外的点。

对加快性能有什么建议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