【问题标题】:SpriteKit FPS low with PhysicsBody collisionsSpriteKit FPS 低,PhysicsBody 碰撞
【发布时间】:2014-04-06 10:42:29
【问题描述】:

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

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

对于瓷砖物理,我为瓷砖使用以下代码:

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; 

【问题讨论】:

    标签: ios ios7 sprite-kit skphysicsbody skphysicsworld


    【解决方案1】:

    你的低帧率可能是由其他因素造成的,但如果不设置你的整个代码,就很难定位主要的罪魁祸首。

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

    【讨论】:

      【解决方案2】:

      发生这种情况的原因有几个。

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

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

      第三,你还没有发布你的- (void)didBeginContact:(SKPhysicsContact *)contact方法。如果实施效率低下或不正确,可能会导致延迟冲突。

      您还应该在 Instruments 中分析您的应用,以便准确确定 FPS 下降的确切位置和时间

      注意:属性 usesPreciseCollisionDetection 可能会导致大量开销,因为您要在屏幕上创建超过 100 个节点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多