1

私の現在のプロジェクトには、スプライトがゲーム シーンで経験する力に応じて移動する重力シミュレーターが含まれています。

私の機能の 1 つは、移動するスプライトの背後に線を描画できるようにすることで、スプライトがたどるパスを確認できるようにすることです。

ここに示されています:

ここに画像の説明を入力

ただし、スプライトが画面上で動き続けると、FPS が急降下し始めます。これは、スプライトが最初に動き始めてから時間が経過したこの 2 番目の画像で確認できます。

ここに画像の説明を入力

調査したところ、他の人が同様の問題を投稿していることがわかりました。

1回の描画で複数のskshapenode?

ただし、上記の質問では、答えのポスターは、それ (答え) がstatic imageを対象としていると詳述していましたが、これは私が望むものではありません。この行は、スプライトパスに影響を与えるものに応じてリアルタイムで変化するためです。動作しなかった古い行に新しい行を追加する機能を実装しようとしたときに反映されました。そのコードはこちら

すべての描画操作に起因するこの絶え間ない FPS の低下を適切に停止する方法を見つけるのを手伝ってくれる人がいるかどうかを尋ねています. 現在の描画コードは 2 つの関数で構成されています。

-(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: スプライトの最新の位置に線を描画します。

  • traceObject: SKPlanetNode (SKSpriteNode のサブクラス) を受け取り、その後に線が描画されるように設定します。

誰かがこれを行う方法を提案し、私が蓄積し続けるひどいオーバーヘッドを減らすことができれば、それは素晴らしいことです.

4

1 に答える 1

-1

いくつかの提案:

  • SKShapeNode は多かれ少なかれ、ほとんどがデバッグ描画用のツールであると考えてください。バッチで描画しないため、それを中心にゲームを作成したり、広範囲に使用したりするのには実際には適していません (多くの形状と少数の形状の両方)。しかし複雑な形状)。
  • カスタム シェーダーを使用して線を描くこともできますが、これはより高速で洗練されたソリューションになる可能性がありますが、もちろん最初にシェーダー プログラムの書き方を学ぶ必要があるかもしれません。
  • シミュレーターではなく、デバイス上でのみパフォーマンスを測定してください。
于 2015-01-16T08:24:27.363 に答える