在SpriteKit中绘制线条时如何避免FPS掉落?

时间:2015-01-16 00:35:43

标签: sprite-kit frame-rate skshapenode

我当前的项目包含一个重力模拟器,精灵根据他们在游戏场景中所经历的力量移动。

我的一个功能涉及允许移动精灵在它们后面画一条线,这样你就可以看到它们采用的路径。

这里显示:

enter image description here

然而,随着雪碧继续在屏幕周围移动,FPS开始潜水。这可以在第二张图片中看到,自精灵第一次开始移动以来已经过了一段时间。

enter image description here

在研究时,我发现其他人发布了类似的问题:

Multiple skshapenode in one draw?

然而,在上面的问题中,答案的海报详细说明它(答案)是针对静态图像,这不是我想要的东西,因为这个line会根据sprite路径的影响实时变化,当我尝试实现一个函数来添加一个新的Line来处理那个没有工作的旧行时,就会反映这一点。那Code here

我问是否有人可以帮助我找到一种方法来正确阻止来自所有绘制操作的持续FPS下降。我当前的绘制代码包含两个函数。

-(void)updateDrawPath:(CGPoint)a B:(CGPoint)b
{
    CGPathAddLineToPoint(_lineToDraw, NULL, b.x, b.y);
    _lineNode.path = _lineToDraw;
}

-(void)traceObject:(SKPlanetNode *)p
{
    _lineToDraw = CGPathCreateMutable();
    CGPathMoveToPoint((_lineToDraw), NULL, p.position.x, p.position.y);
    _lineNode = [SKShapeNode node];
    _lineNode.path = _lineToDraw;
    _lineNode.strokeColor = [SKColor whiteColor];
    _lineNode.antialiased = YES;
    _lineNode.lineWidth = 3;
    [self addChild:_lineNode];
}
  • updateDrawPath: 将线条绘制到Sprite的最新位置。

  • traceObject: 使用SKPlanetNode(SKSpriteNode的子类),并将其设置为在其后面绘制一条线。

如果有人可以建议一种方法来做到这一点,并减少我不断积累的可怕开销,那将是太棒了!

1 个答案:

答案 0 :(得分:-1)

一些建议:

  • 考虑到SKShapeNode或多或少只是一个用于调试绘图的工具,因为它不会分批绘制,因此它不适合制作游戏或使用它广泛地(许多形状以及很少但复杂的形状)。
  • 您可以使用自定义着色器绘制线条,这可能是更快更优雅的解决方案,当然您可能必须首先学习如何编写着色器程序。
  • 请务必仅在设备上测量性能,而不是测量模拟器。