SpriteKit FPS低与PhysicsBody碰撞

时间:2014-04-06 10:42:29

标签: ios ios7 sprite-kit skphysicsbody skphysicsworld

在我的SpriteKit游戏中,我有许多平铺节点(> 100)随机排列,我需要能够检测到平铺和角色节点之间的碰撞。为此,我使用SKPhysicsBody。

我发现如果启用SKPhysicsBody代码,我的帧速率会下降到40fps左右,但如果我注释掉代码,它会上升到60fps。我想这与引擎试图模拟每帧100多个节点的物理有关...有没有办法可以防止这种情况发生,但仍能检测到我的角色和瓷砖之间的碰撞?

对于tile物理,我正在使用以下代码来处理我的tile:

self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:size];
self.physicsBody.affectedByGravity = NO;
self.physicsBody.categoryBitMask = WallCategory;
self.physicsBody.collisionBitMask = 0;
self.physicsBody.contactTestBitMask = CharacterCategory; 

和我的角色:

self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:size];
self.physicsBody.usesPreciseCollisionDetection = YES;

self.physicsBody.restitution = 0;
self.physicsBody.friction = 0;
self.physicsBody.linearDamping = 0;

self.physicsBody.categoryBitMask = CharacterCategory;
self.physicsBody.contactTestBitMask = 0xFFFFFFFF;
self.physicsBody.collisionBitMask = BoundaryCategory; 

2 个答案:

答案 0 :(得分:0)

你的低帧率可能是由其他因素引起的,但如果没有设置你的整个代码,很难将主要罪魁祸首本地化。

如果您的游戏结构可行,您可以考虑禁用physicsBody并自行运行联系人检查。你必须创建一个包含所有tile对象的数组,然后使用SKNode Class中的intersectsNode:来检查玩家和对象之间的任何联系。

答案 1 :(得分:0)

有几个原因可能会发生。

首先,模拟器不像真正的iPhone那样模拟碰撞。如果您单独使用模拟器,我强烈建议您尝试使用实际设备。

其次,您应断言您的应用资源未以低效方式加载,例如延迟加载。应在启动时对后台线程的异步调用中加载资产。有关详细信息,请查看Apple的示例project

第三,您尚未发布- (void)didBeginContact:(SKPhysicsContact *)contact方法。如果低效或不正确地实施,则可能导致滞后冲突。

您还应该在乐器中分析您的应用程序,这样您就可以准确确定FPS下降的确切位置和时间

注意:如果您在屏幕上创建了> 100个节点,则属性usesPreciseCollisionDetection可能会导致大量开销。