使用sprite kit中的渐变效果可将fps从60降低到30

时间:2014-06-04 11:01:04

标签: ios objective-c sprite-kit gradient

我正在为ios开发一个sprite kit游戏项目,我的游戏运行速度为60 fps而不使用渐变效果。我使用的是self.backgroundcolor = [SkColor randomColor],但当我在背景上使用渐变效果时,我的游戏直接降至30 fps。

以下是我用于Gradient效果的代码。

此方法在我的SkScene类中,而不在我的ViewController类中。

#pragme mark - Gradient Effect setup.

- (void)drawRect
{

UIGraphicsBeginImageContext(CGSizeMake(1168, 660));       //For landscape mode.
CGContextRef context = UIGraphicsGetCurrentContext();


CGGradientRef gradient;

CGColorSpaceRef colorSpace;

CGFloat location[] = {1};

UIColor *colorOne = [UIColor colorWithRed:(48/255.0) green:(204/255.0) blue:(255/255.0) alpha:1.0];
UIColor *colorTwo = [UIColor colorWithRed:(200/255.0)  green:(251/255.0)  blue:(255/255.0)  alpha:1.0];

NSArray *color = [NSArray arrayWithObjects:(id)colorTwo.CGColor,
                  (id)colorOne.CGColor, nil];

colorSpace = CGColorSpaceCreateDeviceRGB();

gradient = CGGradientCreateWithColors(colorSpace, (CFArrayRef) color, location);

CGPoint startPoint, endPoint;
startPoint.x = 0;
startPoint.y = 0;

endPoint.x = 0;
endPoint.y = 250;

CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, kCGGradientDrawsAfterEndLocation);

CGColorSpaceRelease(colorSpace);
CGGradientRelease(gradient);

UIImage *newimage = UIGraphicsGetImageFromCurrentImageContext();
SKTexture *newte = [SKTexture textureWithImage:newimage];
newte.filteringMode = SKTextureFilteringNearest;

SKSpriteNode *newnode = [SKSpriteNode spriteNodeWithTexture:newte];
newnode.zPosition = -10;


[gradientCloud addChild:newnode];


}

感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

我遇到了类似的问题,我使用了一个大型精灵,其中一个图像作为我的一个场景的背景。没有它,(只是self.backgroundColor = [SKColor blackColor]),fps大约是60,但是当我添加背景时,它下降到30左右。

问题是我在模拟器上测试应用程序。当我将应用程序加载到真实设备时,fps又回到了60.我甚至还为场景添加了一些粒子效果,fps仍为60.在真实设备上测试你的项目以查看fps是否下降。如果确实如此,则还有另一个问题。如果没有,你一切都好!

答案 1 :(得分:1)

每秒帧数取决于设备处理draw rect方法的速度。移动一切静态的东西,然后再试一次。例如:

UIColor *colorOne = [UIColor colorWithRed:(48/255.0) green:(204/255.0) blue:(255/255.0) alpha:1.0];
UIColor *colorTwo = [UIColor colorWithRed:(200/255.0)  green:(251/255.0)  blue:(255/255.0)  alpha:1.0];

NSArray *color = [NSArray arrayWithObjects:(id)colorTwo.CGColor,
                  (id)colorOne.CGColor, nil];

永远不要改变,将其移到外面并将颜色变成类变量。

此外,渐变本身似乎是静态的,也可以将其移到外面。 draw rect意味着应该在每个周期重新计算的东西。

修改

我再次阅读您的代码,我不确定您要实现的目标。但大多数似乎都是静态的。将它移到循环之外。

答案 2 :(得分:0)

我最好的建议是在实际设备上进行测试,甚至可以在Illustrator或Gimp(免费)或任何可以使用的设备中为节点创建渐变图像。