2014-12-10 2 views
4

Я некоторое время боролся с этой проблемой, которая, похоже, глубоко погружена в физический движок spritekit.Физика спритекита и сглаживание камеры

Мой первый вопрос: будет ли Spritekit обрабатывать свои физические обновления в другом потоке, чем в основном потоке?

У меня есть «мировой» узел в сцене, который я перемещаю, чтобы имитировать «камеру». Таким образом, я могу центрировать «камеру» на моем игровом узле. Так как игрок прыгает вверх и вниз много, я хочу сгладить камеру. Без сглаживания камеры проблем нет. Но когда я добавляю камеры разглаживание, как таковой: (этот код вызывается из didFinishUpdate)

CGPoint ptPosition = self.position; 
float fSmoothY = m_fLastCameraY + (ptPosition.y - m_fLastCameraY) * 0.1; 

CGPoint pointCamera = [self.scene convertPoint:CGPointMake(ptPosition.x, fSmoothY) fromNode:self.parent]; 
[gameScene centerOnPoint:pointCamera]; 

m_fLastCameraY = fSmoothY; 

Если я позвоню приведенный выше код из didSimulatePhysics, он делает ту же самую вещь. Он заикается всякий раз, когда падает (из-за сглаживания Y-камеры).

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

Как я могу это исправить, или работать вокруг него, если он не может быть по-настоящему «фиксированный»?

+0

Вы построили это на устройстве или симуляторе? Вы использовали NSLog для создания данных графика? Если это так, попробуйте избежать этого, потому что ведение журнала добавляет служебные данные, вместо этого собирайте данные в массиве и запишите их после завершения теста. Попробуйте переместить узел с действием перемещения (отключите физику), чтобы увидеть, действительно ли эффект действительно связан с физикой. И следить за частотой кадров, чтобы увидеть, может ли частота кадров колебаться всякий раз, когда есть разница. – LearnCocos2D

+0

@ LearnCocos2D Я тестировал это на iPad Mini, iPad 3 и даже iPhone 5C. Я использовал «NSLog» для построения графика (в Документах Google), но я уверен, что результаты будут одинаковыми, если не будут активно регистрировать данные. Дельта-время в основном такое же (я наметил его раньше, чтобы увидеть его подробно), поэтому я уверен, что FPS плавный: http://i.imgur.com/xhb6ZNp.png – Codecat

+0

@ LearnCocos2D Иногда заикание не происходит Случается, и иногда это происходит. Это похоже на шанс 50/50, что заставляет меня думать, что физика проводится параллельно с регулярными обновлениями игры. – Codecat

ответ

0

Я предлагаю вам применить фильтр с бесконечным импульсным откликом (IIR), чтобы сгладить камеру. Вы можете сделать это ...

Во-первых, объявить переменные экземпляра

CGFloat alpha; 
CGFloat fSmoothY; 

, а затем Initialize альфа и fSmoothY

// alpha should be in [0, 1], where a larger value = less smoothing 
alpha = 0.5; 
fSmoothY = ptPosition.y; 

Наконец, примените фильтр с

fSmoothY = fSmoothY * (1-alpha) + ptPosition.y * alpha; 
+0

Я пробовал это, но он все еще кажется заикающимся. Это не сильно отличается от того, что я делал раньше, не так ли? – Codecat

+0

Это то же самое после того, как вы добавили '* 0,1' к коду в своем вопросе. Обратите внимание, что 'didSimulatePhysics' вызывается примерно 60 раз в секунду. Вероятно, вам понадобится гораздо меньшее значение для 'alpha', чтобы увидеть сглаживание. – 0x141E

+0

Ну, сглаживание работает, это не проблема. – Codecat

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