我正在制作一款游戏,并且我注意到,在某些场景中,我的FPS在55-60FPS区域内不断下降(使用纹理图集)。 这使我疯了,所以我决定把我所有的资产到Images.xcassets文件夹,瞧,稳定的60FPS。
苹果的文档说,使用纹理地图集将提高应用程序的性能。 基本上,允许应用程序利用批处理渲染。 然而...
测试(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中的地图集更好。 尽管如此,地图集看起来好像比xcassets更好地管理内存。
有人知道为什么这些结果显示images.xcassets有更好的性能比地图集?
对于接下来的测试,我继续在离开屏幕后从父级删除精灵。 我也使用了7个不同的图像。 由于平局计算,我们应该看到使用图集的巨大性能提升,但...
发布于 2018-02-20 15:06:18
首先,修改测试以匹配以下内容:
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中:
skView.showsDrawCount = YES;
现在,不只是一个映像,收集3个图像并修改测试,每次创建节点时都选择一个随机的图像,可以这样做:
NSArray *imageNames = @[@"image-0", @"image-1", @"image-2"];
NSString *imageName = imageNames[arc4random() % imageNames.count];
在代码中,每次通过loop.ie使用那个ImageName创建sprite。
SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:imageName];
在SKTextureAtlas测试中,显然要使用相同的ImageName来创建每个sprite。
现在...重新运行测试,并记下每次测试中的抽签计数。
这将提供一个关于SKTextureAtlas批处理呈现的具体示例。
它不是关于渲染同样的精灵图像数千次。
这是关于在同一张画册中画出许多不同的精灵图像。
获得这个呈现优化可能有一些开销,但我认为抽签数应该是不言而喻的,为什么当所有事情都被考虑时,这种开销是没有意义的。
https://stackoverflow.com/questions/-100007403
复制相似问题