SceneKit
Есть ли способ получать уведомления, когда dynamicBody
находится в состоянии покоя? Я хочу удалить dynamicBody
, когда он закончит падать на землю и полностью перестанет двигаться - я предполагаю, что у меня будет довольно много их, поэтому я хотел бы использовать что-то основанное на событиях, а не перебирать все bodies
и проверять их скорости?
SceneKit SCNPhysicsBody получает уведомление об отдыхе
Ответы (1)
Вы можете использовать наблюдение за ключом и значением для свойства isResting
. См. раздел доступно ли наблюдение за ключом и значением (KVO) в Swift?.
Или вы можете использовать SCNPhysicsContact
и SCNPhysicsContactDelegate
для обнаружения столкновений с полом и использовать их для запуска проверки скорости.
person
Hal Mueller
schedule
24.12.2016
Это имеет некоторую стоимость. Вы можете измерить его, чтобы узнать, сколько именно. Еще одна проблема заключается в том, что KVO не очень Swift-y (вы не упомянули язык, который используете). Я не помню навскидку, какова последовательность обратного вызова SCNPhysicsContact, обратного вызова renderer(_:didSimulatePhysicsAtTime:) от SCNSceneRenderer и обновления скоростей объектов; вам, возможно, придется поставить узел в очередь на удаление в одном обратном вызове и удалить его в другом. Использование контактного делегата кажется мне лучшим стилем Swift, хотя я не могу точно сформулировать, почему.
- person Hal Mueller; 26.12.2016
Я использую - Objective-C, я спросил о производительности, потому что я нагружаю процессор - анимация занимает почти 13 мс + флеш и прочее ... У меня осталось менее 1,2 мс - честно говоря, жалко ...
- person ColdSteel; 26.12.2016
Реализовать каждый подход, а затем измерить/сравнить не так уж и сложно. Преждевременная оптимизация - корень всех зол, по словам одного известного человека :-)
- person Hal Mueller; 26.12.2016
Я застрял на полпути туда, сначала мне придется справиться с этим, а затем попробовать оба варианта, как вы предлагаете. Думаю, мне лучше опубликовать вопрос об оптимизации анимации.
- person ColdSteel; 26.12.2016