SCNkit: проблемы с невидимыми узлами - PullRequest
0 голосов
/ 19 февраля 2020

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

Если игрок находится внутри пещеры, видна только небольшая часть сегментов. Я полагаю, что на самом деле сокрытие невидимых сегментов может сэкономить много времени на процессоре, которое мне нужно для других объектов, таких как здания или враги.

Итак, сначала я пытаюсь скрыть всю пещеру, а затем Раскрытие видимых сегментов путем поворота «node.isHidden» в true и false. Определенные узлы находят и получают к ним доступ по их именам: ‚Node.childnode (withName:„ XYZ003 “, рекурсивно: false) .isHidden = true '(или false).

Работает до такой степени, что сегменты не скрыты, но как только я пытаюсь скрыть ранее невидимый сегмент, средство визуализации падает с EXC_BAD_ACCESS.

Делать скрытие на скрытом объекте (конечно, бесполезно, но помогает понять проблему) хорошо То же самое можно сказать о скрытых сегментах.

Следуя подсказке другого потока, я переместил подпрограмму в делегат средства визуализации, поэтому переключение выполнялось не в то время, а вместо этого на этапе, на котором такие изменения должны бывает, но это не помогло. В качестве альтернативы я скрывал (и скрывал) SCNActions, но получил тот же результат, который меня действительно озадачивает, так как это был бы своего рода «официальный» способ сделать это ...

Я также поэкспериментировал с «рекурсивным» логическим значением, получив тот же результат (работает для unhide, вылетает при isHidden = true).

Затем я попытался изменить непрозрачность или другие свойства узлов - что работало отлично. С другой стороны, попытка удалить узлы из родительского узла также привела к упомянутому cra sh.

Мне нужно, чтобы это работало, потому что старое оборудование никогда не сможет справиться с несколькими тысячами узлов (пробуя это, частота кадров упала до 10 кадров в секунду, даже без врагов вокруг). И новое оборудование может сломаться, как только появятся враги ...

Я думаю, что указатель каким-то образом испорчен первым показом (и, следовательно, ошибкой BAD_ACCESS), так что, возможно, дополнительное соединение (часто замечаемое с spritekit-рутины) или другой способ получить указатель узла может быть решением. С другой стороны, если указатель не работает, почему я все еще могу получить доступ ко всем другим свойствам? Возможно, именно подузлы вызывают проблему - у каждого из узлов есть 20 подузлов, которые также должны изменить видимость.

Кто-нибудь сталкивался с таким поведением до меня? Я не смог найти ничего во время моего исследования Google ...

1 Ответ

0 голосов
/ 19 февраля 2020

Часто скрытие и отображение узлов обычно не является проблемой. Вы можете скрыть главный узел, и любые подузлы главного узла будут автоматически скрываться, так что вам не нужно их l oop индивидуально.

Я не экспертный отладчик и не могу Не знаю, какой у вас уровень квалификации, но BAD_ACCESS может означать, что вы пытались отправить сообщение в блок памяти, который не может выполнить сообщение или когда приложение пыталось задержать поврежденный указатель. Ищите «Что такое EXC_BAD_ACCESS и как его отладить», чтобы найти достойное руководство по некоторым вариантам работы с ним.

Я также делаю изменения в делегате рендеринга, но в зависимости от количества изменений и продолжительности они берут, я иногда использую таймеры, чтобы контролировать количество изменений, которые могут быть сделаны за определенный промежуток времени. Таким образом, и после некоторых корректировок, я почти уверен, что я не затяну его до такой степени, что он просто выходит из-под контроля.

Структура может иметь значение - личные предпочтения, но я пытаюсь настроить массив классов, которые создают отдельные узлы (и подузлы) и, следовательно, имеют прямой доступ к ним. Таким образом, я не перебираю всю структуру узлов и не нахожу узлы по имени. Иногда многое происходит перед тем, как мне действительно нужно внести изменения в сам узел, и поэтому я могу l oop просмотреть свой массив классов, проверить значения, сравнить и т. Д. c. перед выполнением действий, связанных с отображением. Это также дает мне возможность удалять системы частиц, удалять действия, устанавливать geometry = nil и обновлять счетчики logi c, когда мне нужно удалить узел.

Я уверен, что мнения меняются, но это сработало хорошо для меня. Как только я стандартизировал структуру, я просто продолжал повторять образец.

Надеюсь, это поможет

...