6

爆発にパーティクルエフェクトを使用するlibGDXゲームを作成しています。これは新しい電話では非常にうまく機能しますが、古い電話(HTC Desireでテスト済み)では、画面で爆発が数回以上発生すると、fpsが大幅に遅れます。

私が現在検討している2つのオプションがあります。

  1. エフェクトごとに多くのパーティクルがあるので、その数を減らすことはオプションかもしれませんが、一貫性と美的理由からではありません。

  2. パーティクルエフェクトを実行して各フレームを保存することで生成されたアニメーションを使用します。これは見栄えがよく、一貫性があります。画像サイズに問題がある可能性があります。また、libGDXパーティクルの実装でこれをどのように実行できるかもわかりません。

何か案は?

編集: コードのいくつかのスニペット:Assetsクラスにエフェクトをロードした後:

particleFire.load(Gdx.files.internal("explosion.p"),Gdx.files.internal(""));

パーティクルエフェクトを発射物オブジェクトのコンストラクターにロードします。最適化の候補であることがわかっているメインレンダリングループでこのオブジェクトの作成を行っています。

                explosion = new ParticleEffect(Assets.particleFire);

レンダリングスレッドでは、このメソッドを呼び出して効果を描画します。

    private void drawBlasts(float delta){

    for(Missile projectile : world.missiles){
    if (projectile.missileState == State.EXPLODING){

        if(projectile.stateTime==0.0f) {
            projectile.explosion.start();
            continue;
        }

        projectile.explosion.setPosition(projectile.position.x, projectile.position.y);
        projectile.explosion.draw(spriteBatcher, delta);


    }
    }

}

爆発のスニペット.p

- Delay -
active: false
- Duration - 
lowMin: 1000.0
lowMax: 1000.0
- Count - 
min: 0
max: 100
- Emission - 
lowMin: 0.0
lowMax: 0.0
highMin: 250.0
highMax: 250.0
relative: false
scalingCount: 1
scaling0: 1.0
timelineCount: 1
timeline0: 0.0
- Life - 
lowMin: 800.0
lowMax: 800.0
highMin: 1000.0
highMax: 1000.0
relative: false
scalingCount: 3
scaling0: 1.0
scaling1: 1.0
scaling2: 1.0
timelineCount: 3
timeline0: 0.0
timeline1: 0.66
timeline2: 0.9931507

編集2:これらの効果は相加的であるため、かなりのブレンドも行われています。

4

1 に答える 1

3

両方のアイデアを見ると、どちらも機能します。1 つ目は、パーティクルを少し大きくして、使用するパーティクルの数を減らすことで解決できます。電話が処理する必要があるパーティクルが少ないほど、各パーティクルが動的に移動し、フレーム ティックごとに多くの計算が行われるため、パフォーマンスが向上します。

処理時間がまったくないかほとんどないため、2番目のオプションの方が良いと思います(単に「爆発」がどれだけ進んだかを計算し、適切なフレームを選択するだけです。ただし、すべての爆発が非常に似ているというトレードオフもあります) . コードの一部を投稿できれば (使用しているパーティクルの数、爆発が発生する頻度、同時に発生している爆発のおおよその数)、それは役に立ちます。パーティクルエフェクトをレンダリングし、各フレームに表示されていた場所に移動するだけで解決しました

編集 1: わかりました。探しているのはパーティクル エフェクト プールだと思います。基本的に、必要に応じてパーティクル エフェクトを作成するのではなく、事前に一定数のパーティクル エフェクトを割り当てます。オブジェクトを個別に割り当てて解放するのではなく、固定プールからオブジェクトを再利用することで、多くのメモリと処理を節約できます。あなたが私の Desire HD で行ったと思われることを試してみたところ、約 22 fps で約 22 fps が得られ、1 秒間に 100 個の奇数パーティクル エフェクトが一度に画面に表示されました。それからそれらをプールすると、約25になりました。正確に驚くほど良いわけではありませんが、少しでも役に立ちます. また、粒子数を約 75% まで減らしても、それほど目立たず、多くのフレームを節約できます!

パーティクル エフェクト プール Libgdx JavaDoc

申し訳ありませんが、これ以上お手伝いできませんでした。

于 2012-11-05T17:28:57.627 に答える