2016-11-04 2 views
0

У меня есть два приложения macOS, которые очень похожи. Одно приложение отображает анимацию в 2-D, с кварцевыми вызовами, в подклассе NSView, другое приложение, трехмерную анимацию в подклассе SCNView (сама по себе подкласса NSView) с использованием геометрий SceneKit. В каждом случае «вид» принадлежит контроллеру вида и что право собственности устанавливается в раскадровке. В каждом случае я использую таймер для грязного просмотра каждую секунду, поэтому его drawRect запускается для управления анимированными движениями. В каждом случае я использовал: self.view.needsDisplay = trueможет быть вызвано вызовом на SCNView (macOS)?

В двумерном случае в экземпляре вида вызывается drawRect, в трехмерном случае это не так (даже для исходного рендера).

Я озадачен! Делает SCNView подавляет звонки на drawRect? Если да, то как я могу обойти это? Если нет, то какой секрет Voodoo я пропустил?

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

Я знаю, что SceneKit может использовать Core Animation, но я хочу сохранить один и тот же общий механизм таймера в обоих приложениях, потому что анимированный контент, по сути, одно и то же действие, то, что было плоским в 2-D, является сферическим в 3-D, поэтому использование рендеринга SceneKit имеет смысл.

Добавлен Xcode проект, чтобы показать различные NSView и SCNView поведения: https://www.dropbox.com/s/qtymzitkqcqhfje/SCN.zip?dl=0

ответ

1

Вы боретесь рамки.

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

Методы, в которых вы нуждаетесь, могут находиться в неожиданных местах. Взгляните на документацию по протоколам SCNSceneRenderer и SCNSceneRendererDelegate. renderer delegate documentation объясняет цикл рендеринга и показывает, где можно настроить анимацию и физику вашего приложения.

+0

Теперь я использую эти обратные вызовы и выполняя свои цели, поэтому, спасибо. Я обнаружил, что делаю много вычислений в вызовах делегатов, некоторые из них не нужны, потому что многие свойства объектов не изменяются так быстро, поэтому я увеличиваю счетчик на каждом цикле рендеринга, но только обновляю «медленные» свойства каждые 60 (или более) циклов. Это немного неприятно, но он выполняет свою работу. Спасибо, Hal –

Смежные вопросы