我已经为这个问题苦苦挣扎了一段时间了,这个问题似乎深藏在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(红线)在整个帧过程中都停滞了。

如何解决此问题,或者如果无法真正“解决”它,如何解决呢?

最佳答案

建议您应用无限冲激响应(IIR)过滤器以使摄像机平滑。你可以通过...

首先,声明实例变量

CGFloat alpha;
CGFloat fSmoothY;

然后初始化alpha和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;

10-07 18:36