Почему SCNNode.presentation.position так относительно медленно, и есть ли обходной путь? - PullRequest
0 голосов
/ 09 февраля 2019

В своем приложении SceneKit я обнаружил узкое место с точки зрения производительности во вложенном цикле, который запускался несколько тысяч раз.В этом цикле находится куча кода, который довольно счастливо масштабируется, кроме этой одной строки:

var scenePos = presentation.position

Это более чем в 100 раз медленнее, чем просто запрос позиции ПЛЮС десятки других вычислений, сравнений, поисков в массивахИ вызовы методов в сочетании с тем, что я делал внутри одного цикла.Я удивлен, что никто, кажется, еще не прокомментировал это, но я могу найти.

Почему это так, и есть ли обходной путь для этого помимо создания копии презентации каждого узла.так что вам не нужно спрашивать об этом узел презентации?Спасибо.

Правки: презентация.позиция только когда-либо читается, никогда не пишется.Ограничивающий ящик никогда не редактируется.Я использую динамический SCNPhysicsBody для нескольких узлов SCN, но подавляющее большинство статично.

1 Ответ

0 голосов
/ 26 марта 2019

Вот обходной путь, который я сейчас использую (для этого, а также отдельная проблема, что presentation.position может быть нулевым, если физика никогда не запускалась для этого узла).Это на несколько порядков быстрее, так как почти все мои узлы не являются динамическими.

// When you're not sure if physics has first run yet
func currentScenePos() -> SCNVector3 {
    if physicsBody?.type == .dynamic {
        var scenePos = presentation.position
        if scenePos.isZero() {
            // Looks like the physics hasn't run on this node yet. Use the regular position.
            // If that's zero too, it must really be at the scene origin.
            scenePos = position
        }
        return scenePos
    } else {
        // Non-dynamic physics. Just use position, it's a lot faster.
        return position
    }
}
...