在我的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;
答案 0 :(得分:0)
你的低帧率可能是由其他因素引起的,但如果没有设置你的整个代码,很难将主要罪魁祸首本地化。
如果您的游戏结构可行,您可以考虑禁用physicsBody并自行运行联系人检查。你必须创建一个包含所有tile对象的数组,然后使用SKNode Class中的intersectsNode:
来检查玩家和对象之间的任何联系。
答案 1 :(得分:0)
有几个原因可能会发生。
首先,模拟器不像真正的iPhone那样模拟碰撞。如果您单独使用模拟器,我强烈建议您尝试使用实际设备。
其次,您应断言您的应用资源未以低效方式加载,例如延迟加载。应在启动时对后台线程的异步调用中加载资产。有关详细信息,请查看Apple的示例project。
第三,您尚未发布- (void)didBeginContact:(SKPhysicsContact *)contact
方法。如果低效或不正确地实施,则可能导致滞后冲突。
您还应该在乐器中分析您的应用程序,这样您就可以准确确定FPS下降的确切位置和时间
注意:如果您在屏幕上创建了> 100个节点,则属性usesPreciseCollisionDetection
可能会导致大量开销。