Почему SCNNode .flattenClone() либо дает сбой, либо ухудшает производительность?

Я пытаюсь добавить около 4.5к SCNNode возражает против сцены. Их геометрия одна из двух SCNPlanes, чьи материалы предоставлены CALayers (но я не думаю, что это имеет значение, CALayerDelegates вызываются только один раз, так что это не проблема. Производительность ужасна (< 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 ответов

Проблема же получится бытьCALayers, но это тонко: если я вместо этого визуализирую CALayer в UIImage (на самом деле я все это делаю как UIGraphicsBeginImageContextWithOptions(...), нет необходимости в явном CALayer), .flattenedClone()действительно делает то, что я ожидаю, и я приближаюсь к 60 кадрам в секунду с любым количеством ячеек. Если я прикреплюCALayer непосредственно к материалу, узлы не сглаживаются.

Может это как-то связано с тем, что CALayerможно анимировать? В любом случае со статическимUIImageоно работает. Этот вопрос дал мне подсказку, упомянув некоторые случаи, когда выравнивание выполняется автоматически, а некоторые не происходят вообще, даже если вы его вызываете.

Другие вопросы по тегам