【问题标题】:Spritekit physics and camera smoothingSpritekit 物理和相机平滑
【发布时间】:2014-12-10 09:31:24
【问题描述】:

我一直在为这个问题苦苦挣扎,这个问题似乎深埋在 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(红线)在帧的过程中口吃。

如果不能真正“修复”,我该如何解决?

【问题讨论】:

  • 你是在设备还是模拟器上绘制的?您是否使用 NSLog 创建绘图数据?如果是这样,请尝试避免这种情况,因为日志记录会增加开销,而是将数据收集到数组中并在测试完成后记录下来。尝试使用移动动作(禁用物理)移动节点,以查看效果是否真正与物理相关。并监控帧率,看看帧率是否会在出现差异时波动。
  • @LearnCocos2D 我一直在 iPad Mini、iPad 3 甚至 iPhone 5C 上进行测试。我使用NSLog 绘制图表(在 Google 文档中),但我确信在不主动记录数据时结果是相同的。增量时间基本相同(我之前绘制过它以详细查看),所以我相当确定 FPS 是平滑的:i.imgur.com/xhb6ZNp.png
  • @LearnCocos2D 有时口吃不会发生,但有时会发生。这就像一个 50/50 的机会,这让我觉得物理是在常规游戏更新的同时完成的。
  • 我对此表示怀疑,因为正如您在 SK Programming Guide 中看到的那样,更新循环图显示了一个清晰的线性过程。这也没有任何意义——Sprite Kit 在计算物理时应该做什么?它已经运行了 update: 方法,它评估了这些动作,因为两者都可能影响物理模拟。然后它模拟物理,但必须等待它完成(并且 didFinishSimulation 运行)才能将结果呈现到屏幕上。多线程不是原因。
  • 但是......也许你在做一些“可疑”的事情?例如,如果您使用 NSTimer、GCD(dispatch_... 方法)或 performSelector:afterDelay 或 inBackground:,那么此代码可能有时会在物理更新之前运行,有时在物理更新之后运行。见:stackoverflow.com/a/23978854/201863

标签: ios objective-c sprite-kit


【解决方案1】:

我建议您应用无限脉冲响应 (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;

【讨论】:

  • 我试过这个,但它似乎仍然结结巴巴。这和我之前做的没什么不同吧?
  • * 0.1添加到问题中的代码后相同。请注意,didSimulatePhysics 每秒被调用大约 60 次。您可能需要更小的 alpha 值才能看到任何平滑。
  • 什么是self?是相机节点还是SKScene 子类?
  • self在我问题的代码中是一个继承自SKSpriteNode的对象,代表玩家。
  • 您是在移动播放器还是相机?你如何移动播放器或相机?
猜你喜欢
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 2012-09-17
  • 2014-07-25
相关资源
最近更新 更多