【发布时间】: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