SKSpriteNode创建导致帧率下降

时间:2014-11-27 04:18:55

标签: ios objective-c xcode

我有一个非常奇怪的问题,我已经走到了尽头。我已经通过探查器找到了问题所在,但我不知道为什么会发生这种情况,所以我无法修复它。

首先对我的问题进行一点描述。我正在创建一个游戏,其中一个主要更新是每帧都会发生的HUD更新。更新HUD的一部分是更改显示字符的弹药,运行状况和当前级别的字符串,这三行代码如下所示:

self.clip.text = [NSString stringWithFormat:@"%lu/%lu", (unsigned long)ammo, (unsigned long)maxAmmo];
self.levelLabel.text = [NSString stringWithFormat:@"Level %lu", (unsigned long)level];
self.lifeAmount.text = [NSString stringWithFormat:@"%d/%lu", health, (unsigned long)maxHealth];

Ammo,maxAmmo,level,health和maxHealth都通过角色对象传递给此方法。当我的问题出现时,这些是占用最多CPU并造成帧速率故障的线路。

现在通过暂停菜单显示下一段代码。它非常粗糙,因此可能看起来很愚蠢,但它基本上会打开一个屏幕,其中一个网格排列成一个网格,最终将成为武器库存的插槽。

- (void)setUpInventory {

    CGFloat rowOffset = self.frame.size.width / kInventoryColumns / 2;
    CGFloat colOffset = self.frame.size.height / kInventoryRows / 2;
    NSInteger count = 0;

    for (int row = kInventoryRows - 1; row >= 0; row--) {
        for (int col = 0; col < kInventoryColumns; col++) {

            SKSpriteNode *inventoryThing;
            if (count < [self.player.inventory count]) {
                inventoryThing = [SKSpriteNode spriteNodeWithColor:[UIColor greenColor] size:CGSizeMake(rowOffset * 2 - 4, colOffset * 2 - 4)];
            } else {
                inventoryThing = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:CGSizeMake(rowOffset * 2 - 4, colOffset * 2 - 4)];
            }
            inventoryThing.position = CGPointMake(col * (self.frame.size.width / kInventoryColumns) + rowOffset, (self.frame.size.height / kInventoryRows) * row + colOffset);
            [self addChild:inventoryThing];
            [self.inventorySprites addObject:inventoryThing];
            count++;
        }
    }
}

当按下暂停按钮时,游戏会显示此场景,然后会有一个返回按钮,让您重新回到游戏中。

这是一个奇怪的部分:前三行代码在游戏过程中更新每一帧时不会造成任何问题。在我进入库存屏幕然后离开后出现问题。从那里,第一次标签之一发生变化(例如,我射击我的枪并且剪辑减少1,因此HUD改变或者我被击中并且我的健康栏被改变)我得到一个变化的大帧下降,这使得游戏无法播放。

我不知道为什么会发生这种情况以及为什么只有在提起库存屏幕后才会发生这种情况。我可以通过在后台线程上执行三行来修复帧速率故障,但这会导致HUD更新延迟,因此对我来说不是一个可行的选择。

非常感谢任何帮助,如果需要,我可以提供更多详细信息。

编辑: 这里有更多信息。游戏的游戏部分是它自己的skscene。暂停按钮创建一个新的自定义skscene(menuScene)并显示它。所有这个菜单场景我都会在其中调用setUpInventory。该菜单被赋予游戏场景属性,该属性在呈现之前被设置,因此当按下返回按钮时,菜单场景仅呈现其游戏场景。由于游戏场景没有菜单场景属性,我假设这将摆脱菜单中创建的所有精灵,所以这不应该是一个问题,虽然我可能是错的。

1 个答案:

答案 0 :(得分:0)

我认为你的问题中没有足够的信息,但这里需要检查。

您只显示了setUpInventory,在内循环中,您正在创建新的SKSpriteNode并设置其位置,然后再将它们添加到您的(推测){{} 1}}。

那么,首先要指出你创造了多少精灵?太多,你会遇到问题......

当用户驳回库存时,现有库存精灵会发生什么?

当您将它们添加到SKScene时,它们会一直闲逛,直到您将它们从场景中移除SKScene或删除它们附加的[SKAction removeFromParent]