2012-05-13 5 views
1

jbox2dオブジェクトをサーフェイスビューに描画して遊んでいますが、実際には私が得ているフレームレートには満足していません(10-13、画面上に複数のオブジェクトがあるとき/ 26-30)。SurfaceViewからより多くのFPSを取得すると、何か改善できますか?

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. 
    } 

よりシンプルSVGsを使用して、もちろん他のものをスピードアップするための方法、それからはありますか? :) ありがとう!


EDIT:

うん、PNG画像に切り替える必要があります、彼らはずっといいFPS率を与えます。スケーリング

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

PNGのみ= 35 ... 40 + FPS

PNG = 32 ... 37+ FPS

PNGとスケーリング&回転= 27+ FPS

enter image description here

答えて

1

を私たちは知ってみましょうおそらく、SVGの代わりにラスタライズされたイメージを使用するべきです。コンパイルの前/中にpngなどに保存するか、電話を(最初の)起動時にフィッティングイメージに変換することができます。

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

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

編集:携帯電話が本当に古い場合を除き、デバッグモードでも〜20fps以上の性能を達成する必要があります。 box2dの世界を最適化することを検討してください。おそらくLibgdxフレームワークの使用を検討すべきです。 Box2dのJNIラッパーを提供し、パフォーマンスを大幅に向上させます。

EDIT2:私は(ユーザーがズームインまたはズームアウトするとき )を、それらを回転させ、拡大縮小しなければならないとき

PNGファイルに問題が開始

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

Libgdx BOX2D

私はそこにあるパフォーマンスの向上のどのくらいを知りません。

+0

答えをいただきありがとうございます。PNGの問題は、ユーザーがズームインまたはズームアウトしたときに回転および拡大縮小する必要が生じたときに始まります...一方、回転はSVGの回転角度をすべてレンダリングすることで解決できます1つの大きなスプライト...しかしスケーリング... –

+0

>>>あなたはあなたのすべての画像を含む1つの大きなスプライト/ imageatlasを作成する必要があります<<これは同様に(SVGから入手した)画像でドームになると思いますか? PNGに交換することを決めた場合にのみ、私はそれに入るべきですか? –

+0

2.3のNexus Sを持っているので、うまくいけばそれほど古くはありません。デバッグでは20を超え、平均では26-30です。 22は本当に複雑になりました。 :)あなたはJNI/Box2dをJBox2dよりも使用することの改善がどれだけ素晴らしいと思いますか? –

1

すぐに、この行は奇数として私を打つ:

rlBodyImage bi = new rlBodyImage(); 

新しいrlBodyImageを作成しているすべてのフレームで、その名前を指定すると、これは簡単なことではないと思われます。

ただし、次の行は、そのイメージを無視します:

bi = (rlBodyImage) b.getUserData(); 

ではなく、これらの2行で、あなたのループ内でこれを試してみてください:

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

それは場合に役立ちます:)

+0

ありがとうございます! 2〜3枚増えました! :) –

+0

もちろん、唯一の本当の答えは、より簡単なSVGですが、私は助けてくれるとうれしいです! – deanWombourne

関連する問題