0

在我的 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; 
4

2 回答 2

0

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

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

于 2014-04-06T15:14:31.067 回答
0

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

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

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

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

您还应该在 Instruments 中分析您的应用程序,以便准确确定 FPS 下降的时间和地点

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

于 2014-09-04T22:57:11.827 回答