Почему SCNNode .flattenClone() либо дает сбой, либо ухудшает производительность?
Я пытаюсь добавить около 4.5к SCNNode
возражает против сцены. Их геометрия одна из двух SCNPlane
s, чьи материалы предоставлены CALayer
s (но я не думаю, что это имеет значение, CALayerDelegate
s вызываются только один раз, так что это не проблема. Производительность ужасна (< 1fps.)
С участием .showsStatistics
включен Я вижу, что я делаю почти 3,5 тыс. звонков, что является моей проблемой в соответствии с этим видео WWDC 2017 года. Итак, как и предполагалось, я добавляю все свои узлы в один родительский узел и вызываю .flattenedClone()
на нем, прежде чем добавить это к корневому узлу сцены. Это приводит меня к графическому повреждению и повторяющейся ошибке на моей консоли:
2019-08-28 14:50:39.122937+0200 Breadboard[867:53252] [SceneKit] Error: C3DProgramHashCodeStoreRegisterProgramForRendererElement - index out of capacity (8192 > 8192)
(X в "x > 8192" увеличивается на одну каждую строку)
Если я разделю узлы на две группы и вызову .flattenedClone()
на них перед добавлением результатов в корневой узел ошибка исчезает, но мое количество вызовов отрисовки увеличивается почти до 5 тысяч!
В чем дело? Почему звонит .flattenedClone()
на узле с узлами около 2,5 Кб нет... сплющить это?
0 ответов
Проблема же получится бытьCALayer
s, но это тонко: если я вместо этого визуализирую CALayer
в UIImage
(на самом деле я все это делаю как UIGraphicsBeginImageContextWithOptions(...)
, нет необходимости в явном CALayer
), .flattenedClone()
действительно делает то, что я ожидаю, и я приближаюсь к 60 кадрам в секунду с любым количеством ячеек. Если я прикреплюCALayer
непосредственно к материалу, узлы не сглаживаются.
Может это как-то связано с тем, что CALayer
можно анимировать? В любом случае со статическимUIImage
оно работает. Этот вопрос дал мне подсказку, упомянув некоторые случаи, когда выравнивание выполняется автоматически, а некоторые не происходят вообще, даже если вы его вызываете.