首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何实现SpriteKit纹理地图集与图像xcAsset?

如何实现SpriteKit纹理地图集与图像xcAsset?
EN

Stack Overflow用户
提问于 2018-02-20 05:11:08
回答 1查看 0关注 0票数 0

我正在制作一款游戏,并且我注意到,在某些场景中,我的FPS在55-60FPS区域内不断下降(使用纹理图集)。 这使我疯了,所以我决定把我所有的资产到Images.xcassets文件夹,瞧,稳定的60FPS。

苹果的文档说,使用纹理地图集将提高应用程序的性能。 基本上,允许应用程序利用批处理渲染。 然而...

测试(https://github.com/JRam13/JSGlitch)):

代码语言:javascript
复制
- (void)runTest
{
    SKAction *spawn = [SKAction runBlock:^{

        for (int i=0; i<10; i++) {


            SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];

            sprite.xScale = 0.5;
            sprite.yScale = 0.5;
            sprite.position = CGPointMake(0, [self randomNumberBetweenMin:0 andMax:768]);

            SKAction *action = [SKAction rotateByAngle:M_PI duration:1];

            [sprite runAction:[SKAction repeatActionForever:action]];

            SKAction *move = [SKAction moveByX:1200 y:0 duration:2];

            [sprite runAction:move];

            //notice I don't remove from parent (see test2 below)
            [self addChild:sprite];

        }

    }];

    SKAction *wait = [SKAction waitForDuration:.1];

    SKAction *sequence = [SKAction sequence:@[spawn,wait]];
    SKAction *repeat = [SKAction repeatActionForever:sequence];

    [self runAction:repeat];
}

结果:

多次测试表明,使用xcassets比FPS中的地图集更好。 尽管如此,地图集看起来好像比xcassets更好地管理内存。

有人知道为什么这些结果显示images.xcassets有更好的性能比地图集?

对于接下来的测试,我继续在离开屏幕后从父级删除精灵。 我也使用了7个不同的图像。 由于平局计算,我们应该看到使用图集的巨大性能提升,但...

EN

回答 1

Stack Overflow用户

发布于 2018-02-20 15:06:18

首先,修改测试以匹配以下内容:

代码语言:javascript
复制
    for (int i=0; i<10; i++) {


        SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];

        sprite.xScale = 0.5;
        sprite.yScale = 0.5;
        float spawnY = arc4random() % 768;
        sprite.position = CGPointMake(0, spawnY);

        SKAction *action = [SKAction rotateByAngle:M_PI duration:1];

        [sprite runAction:[SKAction repeatActionForever:action]];


        SKAction *move = [SKAction moveByX:1200 y:0 duration:2];

        // next three lines replace the runAction line for move
        SKAction *remove = [SKAction removeFromParent];
        SKAction *sequence = [SKAction sequence:@[move, remove]];
        [sprite runAction:sequence];

        [self addChild:sprite];

    }

重新运行测试,应该注意到,框架不会像在测试中那样恶化。测试基本上说明了从不删除节点,但继续创建新节点时会发生什么。

接下来,在设置skview时,将以下行添加到ViewController中:

代码语言:javascript
复制
skView.showsDrawCount = YES;

现在,不只是一个映像,收集3个图像并修改测试,每次创建节点时都选择一个随机的图像,可以这样做:

代码语言:javascript
复制
 NSArray *imageNames = @[@"image-0", @"image-1", @"image-2"];
 NSString *imageName = imageNames[arc4random() % imageNames.count];

在代码中,每次通过loop.ie使用那个ImageName创建sprite。

代码语言:javascript
复制
SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:imageName];

在SKTextureAtlas测试中,显然要使用相同的ImageName来创建每个sprite。

现在...重新运行测试,并记下每次测试中的抽签计数。

这将提供一个关于SKTextureAtlas批处理呈现的具体示例。

它不是关于渲染同样的精灵图像数千次。

这是关于在同一张画册中画出许多不同的精灵图像。

获得这个呈现优化可能有一些开销,但我认为抽签数应该是不言而喻的,为什么当所有事情都被考虑时,这种开销是没有意义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档