Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在运行时从nsarray添加SKSpriteNode而不降低帧速率_Ios_Objective C_Sprite Kit - Fatal编程技术网

Ios 如何在运行时从nsarray添加SKSpriteNode而不降低帧速率

Ios 如何在运行时从nsarray添加SKSpriteNode而不降低帧速率,ios,objective-c,sprite-kit,Ios,Objective C,Sprite Kit,我要做的是在游戏开始前创建一个关卡所需的所有精灵,这样我一次就不会有太多精灵 我把它们分成4个数组,每个数组对应一个级别的部分,级别被分成4个部分 因此,当玩家跨越到某一关卡时,场景会添加所有精灵。 这几乎是完美的,除了当场景添加阵列的精灵时,帧速率会有轻微的,有时甚至是很大的下降 是否可以在运行时添加精灵而不影响帧速率 这里有一些伪代码来解释我要做的事情 在SpriteClass.m中 _sprite = [[Sprite alloc] init]; _spr

我要做的是在游戏开始前创建一个关卡所需的所有精灵,这样我一次就不会有太多精灵

我把它们分成4个数组,每个数组对应一个级别的部分,级别被分成4个部分

因此,当玩家跨越到某一关卡时,场景会添加所有精灵。 这几乎是完美的,除了当场景添加阵列的精灵时,帧速率会有轻微的,有时甚至是很大的下降

是否可以在运行时添加精灵而不影响帧速率

这里有一些伪代码来解释我要做的事情

在SpriteClass.m中

        _sprite = [[Sprite alloc] init];

        _sprite.position = location;
        _sprite.anchorPoint = CGPointMake(.5,.5);
        _sprite.zPosition = 5;

        _sprite.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:      
        CGSizeMake
        (_sprite.size.width, _sprite.size.height / 4)];
        _sprite.physicsBody.dynamic = NO;
        _sprite.physicsBody.restitution = 0.0;
        _sprite.physicsBody.categoryBitMask = PCFloor;
        _sprite.physicsBody.contactTestBitMask = PCPlayerCategory;
        _sprite.physicsBody.collisionBitMask = PCPlayerCategory;
        _sprite.name = @"sprite";


if (_sprite.position.x < 4000) {
[[Singleton shared].spriteArray1 addObject:_sprite];

} 


else if (_sprite.position.x > 4000 && _sprite.position.x < 8000) {
[[Singleton shared].spriteArray2 addObject:_sprite];

}


else if (_sprite.position.x > 8000 && _sprite.position.x < 12000) {
[[Singleton shared].spriteArray3 addObject:_sprite];

} 


else if (_sprite.position.x > 12000) {
[[Singleton shared].spriteArray4 addObject:_sprite];

}
在MyScene.m中

产卵盒是玩家与之相交的矩形,用来让游戏知道玩家在哪个区域

-(id)initWithSize:(CGSize)size {
if (self = [super initWithSize:size]) {

spawnNum = 1;
[self spawn];


}

return self; 
}


-(void)spawn {

switch (spawnNum) {
case 1:

        for (int x = 0; x < [Singleton shared].spriteArray1.count; ++x) {
           [myScene addChild:[[Singleton shared].spriteArray1 
            addObject:_sprite];  objectAtIndex:x]];
        }

         spawnBox = CGRectMake(3500, 0,32,  _tileMap.mapSize.height * _tileMap.tileSize.height);
         ++spawnNum;

 switch (spawnNum) {
 case 2:

        for (int x = 0; x < [Singleton shared].spriteArray2.count; ++x) {
            [myScene addChild:[[Singleton shared].spriteArray2 
            addObject:_sprite];  objectAtIndex:x]];
        }

         spawnBox = CGRectMake(3500, 0,32,  _tileMap.mapSize.height * _tileMap.tileSize.height);
         ++spawnNum;

  switch (spawnNum) {
      case 3:

        for (int x = 0; x < [Singleton shared].spriteArray3.count; ++x) {
            [myScene addChild:[[Singleton shared].spriteArray3 
            addObject:_sprite];  objectAtIndex:x]];
        }

         spawnBox = CGRectMake(3500, 0,32,  _tileMap.mapSize.height * _tileMap.tileSize.height);
         ++spawnNum;

 switch (spawnNum) {
    case 4:

        for (int x = 0; x < [Singleton shared].spriteArray4.count; ++x) {
            [myScene addChild:[[Singleton shared].spriteArray4 
            addObject:_sprite];  objectAtIndex:x]];
        }

        spawnBox = CGRectMake(3500, 0,32,  _tileMap.mapSize.height * _tileMap.tileSize.height);
        ++spawnNum;

    default:
        break;
}

}

另外,我正在iphone 5c、6、iPad air、第一代iPad mini上进行测试。

您是否实现了删除不再可见的精灵?
您可以尝试平滑地添加新精灵。我的意思是,不要一次添加整个部分,而是在关卡移动时添加关卡部分。

你应该提前创建精灵并重用它们,而不是以相对缓慢的速度创建新的精灵,尤其是在纹理没有被更新的情况下preloaded@LearnCocos2D我以前确实创建过它们,我只是根据需要调用addChild。addChild是导致下降的原因。我在想可能是因为一次有太多的addChild电话。也许延迟一点会有帮助吗?@LetaOn我试着根据需要分配新的精灵,这会导致帧速率大幅下降。我不能删除任何可见的精灵,因为它们是玩家回溯时需要的。然后你可以在两边都删除。动态添加地图。例如,添加3个屏幕大小。当前屏幕、左1屏幕和右1屏幕。然后,当您移动其中一个时,将从场景中移除,并向场景中添加一个新对象。