我们的场景只有大约 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)
}