我正在制作游戏,我注意到在某些场景中,我的 FPS 一直在 55-60FPS 区域附近下降(使用纹理图集)。这让我发疯了,所以我决定把我所有的资产放到 Images.xcassets 文件夹中,瞧,稳定的 60FPS。
我认为这是侥幸或我做错了什么,所以我决定开始一个新项目并执行一些基准测试......
Apple 的文档说使用纹理图集将提高应用程序的性能。基本上,允许您的应用程序利用批量渲染。然而...
测试(https://github.com/JRam13/JSGlitch):
- (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 中的 atlas 表现更好。不过,atlas 似乎确实比 xcassets 管理内存稍好。
有谁知道为什么这些结果表明 images.xcassets 比图集有更好的性能?
我提出的一些假设:
- xcassets 比 atlasas 优化得更好。
- atlasas 擅长在一次绘制过程中绘制大量图像,但重复精灵的开销更大。如果为真,这意味着如果您的精灵多次出现在屏幕上(在我的原始游戏中就是这种情况),最好将其从图集中删除。
必须填写地图集表以优化性能
更新
对于下一个测试,我继续并在它离开屏幕后从父级中删除了精灵。我还使用了 7 个不同的图像。由于绘制次数,我们应该看到使用 atlas 的巨大性能提升,但是......