SCNNode.flattenClone() не уменьшает вызовы отрисовки
Я пытаюсь оптимизировать свое приложение SceneKit, уменьшив количество вызовов отрисовки. Исходя из документации Apple и многих обсуждений WWDC, объединение множества дочерних узлов в один узел с помощью flatlinedClone() должно уменьшить количество вызовов отрисовки, но я не могу уменьшить количество вызовов отрисовки, используя этот метод.
Я приложил простой пример приложения SceneKit, которое демонстрирует, как flatlinedClone не уменьшает вызовы отрисовки.
Когда приложение запускается, 5 объектов отображаются, и вы можете увидеть 5 вызовов. (ну 6 на самом деле, если вы взаимодействуете с камерой).
Затем, если вы нажмете кнопку переключения, 5 узлов будут сведены в один узел. Это все еще приводит к 5 розыгрышам!
Похоже, что это полностью противоречит разным видам документации и разговорам о flatlinedClone. Есть идеи о том, что происходит?
Вы можете запустить простое приложение здесь, в симуляторе или на устройстве iOS: https://drive.google.com/open?id=1ZJQZAnHtOCeK_3WzbdD0vLLJ2kWTKao- Обратите внимание, что вам нужно повернуть камеру, чтобы получить обновленную статистику вызовов на ничью.
let nodes = SCNScene.init(named:
"nodes.scn")!.rootNode.childNode(withName: "parentNode", recursively: true)!;
//Unflattened version:
scene.rootNode.addChildNode(nodes)
//Flattened version:
let flattenedNode = nodes.flattenedClone()
scene.rootNode.addChildNode(flattenedNode)
Скриншот
1 ответ
ОК, я решил это. Джеймс П был прав. Все 5 объектов были использованы разные материалы.
Если вы используете один и тот же материал для всех объектов, а затем сплющены в один узел, количество вызовов отрисовки уменьшается с 6 до 2. Вы можете запустить это самостоятельно, чтобы увидеть: https://drive.google.com/open?id=1En3tZ9QFTZPd2-xJwCA-0CMO3QWX8UZt
Я подал ошибку в Apple, и они подтвердили, что причина, по которой количество розыгрышей не сокращается, заключается в 5 отдельных материалах. Итак, в заключение: SceneKit ведет себя так, как ожидалось.