1

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

我的功能之一是允许移动的精灵在它们后面画一条线,这样你就可以看到它们走的路径。

此处显示:

在此处输入图像描述

然而,随着 Sprite 继续在屏幕上移动,FPS 开始下降。这可以在第二张图片中看到,自精灵第一次开始移动以来已经过去了一段时间。

在此处输入图像描述

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

一次绘制多个skshapenode?

但是,在上面的问题中,答案的海报详细说明它(答案)是针对静态图像的,这不是我想要的,因为这条线会根据影响精灵路径的因素而实时变化,这是当我尝试实现一个函数以向旧行添加一条新行时反映了这一点,但它不起作用。该代码在这里

我在问是否有人可以帮助我找到一种方法来正确阻止来自所有绘制操作的这种持续的 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 的子类),并将其设置为在其后绘制一条线。

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

4

1 回答 1

-1

几个建议:

  • 考虑到 SKShapeNode 或多或少只是一个主要用于调试绘图的工具,由于它不会批量绘制,因此真的不适合围绕它制作游戏或广泛使用它(许多形状以及少数但形状复杂)。
  • 您可以使用自定义着色器绘制线条,这可能是更快、更优雅的解决方案,当然您可能必须先学习如何编写着色器程序。
  • 确保只在设备上测量性能,而不是在模拟器上。
于 2015-01-16T08:24:27.363 回答