【问题标题】:Adding same sprite many times in SpriteKit在 SpriteKit 中多次添加相同的精灵
【发布时间】:2013-10-26 18:12:22
【问题描述】:

我正在使用 Sprite Kit 构建简单的游戏,其中关卡由相同的矩形块构建。但是当我添加很多块(即 1000)时,游戏变得非常慢(FPS 下降到 20)。以下是我向场景添加块的方法:

-(void)drawLevel
{
    SKSpriteNode *shelf = [SKSpriteNode spriteNodeWithTexture:_initialLevel.earthBoxTexture];
    shelf.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:shelf.size];
    shelf.physicsBody.dynamic=NO;
    shelf.physicsBody.categoryBitMask = platformCategory;

    for (NSValue *positionValue in _initialLevel.boxPositions)
    {
        shelf.position = positionValue.CGPointValue;
        [_platformsNode addChild:[shelf copy]];
    }

    [_world addChild:_platformsNode];
}

_world 是主场景的子对象。我创建“架子”一次,然后复制它。我应该怎么做才能获得好的 FPS?

应用在 iPhone 5 上进行了测试。

【问题讨论】:

  • 这是在设备上还是在模拟器上?我认为给出的答案是正确的,但值得在问题中添加该信息。模拟器中的 20fps 和设备上的 20fps 是截然不同的情况。
  • 对于仅使用 1 个节点的解决方案,请参阅 stackoverflow.com/a/37768928/763355

标签: objective-c cocoa-touch nodes sprite-kit


【解决方案1】:

不将这么多精灵与物理实体一起使用怎么样?

一千个肯定是几百个太多了,特别是如果它们都在屏幕上并且如果许多物体产生接触事件(即堆叠时)。尽管在这种情况下它们都是静态的,所以它们不应该产生联系事件。仍然需要绘制很多精灵。

在所有或大部分节点上执行的任何代码也会使事情变得更糟。仅供参考,我有一个应用程序在屏幕上绘制了大约 400 个精灵,在滚动时更新它们并运行自定义游戏逻辑 - 这个应用程序在 iPod touch 5G 上几乎不能达到 60 fps。

另外,请务必在设备上测试性能。模拟器不能用于评估性能。

【讨论】:

  • 感谢您的回答!这些块中的大多数不在屏幕上(大约 100 个在屏幕上可见)。到目前为止,我在关闭联系事件的情况下对其进行了测试,但它仍然很慢。由于这些块是关卡的一部分,我需要它们不能被穿透 - 我可以在没有物理体的情况下做到这一点吗?
【解决方案2】:

我会推荐使用一个使用 sprite sheet 地图的系统,如果操作正确,它将节省大量资源。把它写下来有点棘手,但是精灵表的每个部分都可以设置为不同的对象,这些对象可以以不同的方式与你的精灵交互。祝你好运,如果你还在寻找解决这个问题的方法,我自己还在用 SpriteKit 学习 Tiled,但它看起来很有希望。

http://www.raywenderlich.com/62049/sprite-kit-tutorial-make-platform-game-like-super-mario-brothers-part-1 - 使用 Tiled 和 SpriteKit 的教程说明

http://www.mapeditor.org - 平铺网站

【讨论】:

    猜你喜欢
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多