轻松/高效地检查/删除SKScene sprite儿童?

hel*_*on3 3 objective-c ios sprite-kit

使用SpriteKit处理iOS游戏.我的背景由地图图块组成(本质上是一个无限的图,程序生成).

我们的系统旨在管理地图的"块",我们只在播放器附近加载块.由于SpriteKit需要我们添加SKSpriteNodes,我们不再对不再靠近播放器的块/块的"卸载"精灵进行干净控制.

我意识到SpriteKit实际上不会在屏幕外渲染事物,但是如果我们无法移除不再需要的精灵,或者检查是否已经添加了块/块,它将会破坏性能.

既然SKNodes没有回应isEqual:,我只看到两种方法:

  • 为每个sprite命名一个带有chunk/tile坐标的名称,并在每次更新时检查此名称
  • 维护一个单独的加载图块数组并检查它

如果已添加精灵,有没有更简单的检查/删除方法?也许精灵名称上的部分字符串匹配?

我不确定使用SpriteKit是最好的解决方案(Xcode模拟器似乎以30fps的速度拖动,尚未在真实设备上进行测试).我们最初用Java构建这个游戏,我们正在渲染我们自己的纹理 - 因此只能加载并可以手动输入到opengl中.

-(void) renderToScene:(SKScene *)scene {

    for( Chunk *chunk in loadedChunks ){
        for( Tile *tile in [chunk getTiles] ){

            SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithTexture:tileTexture];
            sprite.name = @"Tile";
            sprite.position = CGPointMake(realX,realY);
            [scene addChild:sprite];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Lea*_*s2D 6

事实上,杀死你的帧率通常是创建和删除节点 - 你应该有一个精灵池,你可以重复使用而不是重新创建.

只需重新使用精灵的纹理,位置和其他属性,重新使用其中一个不再需要的属性.一个常见的用例是让足够的图块跨越整个屏幕加上一行和一列,这样当整个行或列移出屏幕外,您可以根据地图数据使用新纹理在另一侧重新定位它.