我试图在动画时改变SKSpriteNode的纹理,但是我面临FPS丢弃!它从60下降到30!在设备和模拟器上!节点是并行滚动背景,这里是代码:SpriteKit - 改变纹理后的FPS掉落
- (void)createBricksEdge {
brickEdges = [[SKSpriteNode alloc]initWithImageNamed:@"edge.png"];
brickEdges.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));;
brickEdges.name = @"edge";
[self addChild:brickEdges];
bEdge1 = [[SKSpriteNode alloc]initWithImageNamed:@"edge.png"];
bEdge1.position = CGPointMake(brickEdges.position.x,brickEdges.position.y+(brickEdges.size.height));
bEdge1.name = @"edge";
[self addChild:bEdge1];
}
运动背景:
- (void)moveBg
{
[self enumerateChildNodesWithName:@"edge" usingBlock: ^(SKNode *node, BOOL *stop)
{
SKSpriteNode * bg = (SKSpriteNode *) node;
if (isSpeedBonus == YES) {
SPEED = 200;
} else {
switch (speedCriteria) {
case 0:
SPEED = 7.0;
break;
case 1:
SPEED = 11;
NSLog(@"FPS drops");
[bg runAction:[SKAction setTexture:[SKTexture textureWithImage:[UIImage imageNamed:@"edgeSpeed.png"]]]];
//I also tried : [bg setTexture:textre];
break;
.
.
.
.
.
}
}
bg.position = CGPointMake(bg.position.x , bg.position.y - SPEED);
if (bg.position.y <= -bg.size.width)
{ bg.position = CGPointMake(bg.position.x ,bg.position.y + bg.size.height*2); }} ];
}
更新帧:
- (void)speedOMeter
{
int i = (int)[scoreLabel.text integerValue];
if (i <= 1000) {
speedCriteria = 0;
} else if (i <= 1500) {
speedCriteria = 1;
} else if (i <=2000) {
speedCriteria = 2;
} else if (i <= 2500) {
.
.
.
.
}
- (void)update:(CFTimeInterval)currentTime {
if (_lastUpdateTime)
{
_dt = currentTime - _lastUpdateTime;
}
else
{
_dt = 0;
}
_lastUpdateTime = currentTime;
[self moveBg]; [self speedOMeter];
}
您是否尝试过预加载纹理? – ZeMoon
@akashg不,我应该怎么做? –
如果它是单个纹理,请调用-preloadWithCompletionHandler:就可以了。如果有多个纹理,请将它们从图集中提取出来或放入数组中,并调用+ preloadTextures:withCompletionHandler:on。确保在场景的init方法中执行此操作,并将可以在完成块中删除的加载器放入。 – ZeMoon