1

jbox2d オブジェクトを surfaceview に描画して遊んでいますが、取得しているフレームレートに実際には満足していません (10-13、画面上に複数のオブジェクトがある場合/デバッグではさらに 26- 30)。

    while (isRun)
        {
            Canvas canvas = holder.lockCanvas();
            _update(canvas); /// <- call to update
            holder.unlockCanvasAndPost(canvas);
        }

...

    canvas.drawColor(0xFF6699FF);

    for ( Body b = world.getBodyList(); b!=null; b = b.getNext() ) // <- cycle through all the world bodies
    {
        rlBodyImage bi = new  rlBodyImage();
        bi = (rlBodyImage) b.getUserData();
        float x = b.getPosition().x*scale + wOffset + camera_x + camera_x_temp;
        float y = b.getPosition().y*-scale + hOffset + camera_y + camera_y_temp;
        canvas.save();
        canvas.translate( x - (bi.getImage().getWidth()*bi.getCoof()*scale)/2 , y - (bi.getImage().getHeight()*bi.getCoof()*scale)/2 );
        canvas.scale( bi.getCoof()*scale , bi.getCoof()*scale );
        canvas.rotate( (float) -(b.getAngle() * (180/Math.PI)) , bi.getImage().getWidth() /2 , bi.getImage().getHeight() /2 );
        canvas.drawPicture(bi.getImage()); // <- draw the image assossiated with current body on canvas
        canvas.restore();                  // images are stroed as "Pictures" , extracted from SVGs.
    }

もちろん、より単純なSVGを使用する以外に、物事をスピードアップする方法はありますか? :) ありがとう!


編集 :

はい、PNG に切り替える必要があります。PNG の方が FPS レートが高くなります。

ベクトル画像 = 10...13...16 FPS

PNG のみ = 35...40+ FPS

スケーリング付き PNG = 32...37+ FPS

スケーリングと回転を含む PNG = 27+ FPS

ここに画像の説明を入力

4

2 に答える 2

1

すぐに、この行は奇妙に思えます:

rlBodyImage bi = new  rlBodyImage();

新しい rlBodyImage を作成しているフレームごとに、その名前を考えると、それは簡単なことではないと思います。

ただし、次の行はその画像を無視します:

bi = (rlBodyImage) b.getUserData();

これらの2行の代わりにループ内でこれを試してください:

rlBodyImage bi = (rlBodyImage) b.getUserData();

それが役立つかどうかお知らせください:)

于 2012-05-13T07:35:40.563 に答える
1

おそらく、SVG の代わりにラスタライズされた画像を使用する必要があります。コンパイル前/コンパイル中にそれらをpngまたは同様のものに保存するか、電話は(最初の)起動時にそれらを適切な画像に変換できます。

また、フレームごとに複数回描画されるテクスチャを交換しているようです。これは、GPU にとって非常に高価です。すべての画像を含む 1 つの大きなスプライト/imageatlas を作成し、それを GPU にロードしてから、そのさまざまな領域を画面に描画する必要があります。

また、長期間使用しない場合は、フレームごとに多くの新しいオブジェクトを割り当てないでください。GC は時々ゲームを短時間フリーズさせ、fps を落とします。

編集: また、デバッグ モードで ~20 fps をはるかに超える値を達成する必要があります (携帯電話が本当に古い場合を除きます)。box2d ワールドの最適化を検討してください。Libgdx フレームワークの使用を検討する必要があります。Box2d の JNI ラッパーを提供し、パフォーマンスを大幅に向上させます。

編集2:

PNG の問題は、PNG を回転およびスケーリングする必要があるときに発生します (ユーザーがズームインまたはズームアウトしたとき)。

これは問題ではありません。画面に表示される最大サイズで PNG を保存し、サイズを合わせて回転させます。適切な縮小フィルターを使用し、周囲に余分なスペースを追加する場合 (例については、この投稿を参照)、品質の低下は最小限に抑えられるはずです。必要に応じて、各スプライトの 1 つの大きいバージョンと小さいバージョンを作成し、最適なものを描画できます。または、OpenGL でミップマッピングを使用します。また、各スプライトのすべてのサイズ/角度のバージョンを保存する必要はありません。

Libgdx Box2D

パフォーマンスがどれだけ向上したかはわかりません。

于 2012-05-13T07:37:41.287 に答える