0

PlayN を使用して Android でゲームをスムーズに実行しようとしていますが、すべてが期待どおりに動作しますが、フレームレートが非常に低くなります。私は間違った方法でやっているかもしれないと思うので、誰かが私に助けを与えることができれば素晴らしいと思います:D.

そのため、現在 ImmediateLayer を作成してクリーニングし、すべてのフレームですべてのオブジェクトを描画しています。画像は、graphics.getImage(...) を使用して 1 回読み込まれます。HTC Desire (デバッグ モードで接続) で約 100 fps を取得しながら、約 100 枚の画像を描画します。オブジェクトを追加すると遅くなります。私が本当に間違ったことをしていると思うのは、PlayN がこれらのメッセージでログをスパムしている (私は DDMS を使用してログをチェックしている) ことです。

X テクスチャが残っています

Y 作成されたテクスチャ

1秒間に約20回出現します。

だから基本的に私はこのようなことをしています:

public void draw(Surface s){
for (Drawable d : toDraw) {
        surface.drawImage(d.getImage(), d.x, d.y, d.w, d.h); }}

immediateLayer のレンダラーで draw が呼び出される場所。

お時間をいただきありがとうございます!

ルーカス

編集: playnメーリングリストでそのスレッドを読んで、可能な答えを見つけました。 https://groups.google.com/forum/?fromgroups#!topic/playn/XJTlBgmfzaQ

特にそのメッセージ

ほとんどのタイルは同じ画像を共有していますが、その部分は異なります(私の知る限り、コピーではなく、画像のサブ部分への参照を作成するだけの subImage によって取得されますか?)。異なるサブパーツはテクスチャの変化を引き起こしますか?

サブイメージは同じテクスチャを共有しますが、同じテクスチャを共有するすべてのイメージを一緒にレンダリングする必要があります。イメージ A からのサブイメージの束とイメージ B からのサブ イメージの束があり、A、B、A、B、A、B、A、B をレンダリングすると、8 つの異なるイメージをレンダリングした場合と同じパフォーマンスが得られます。A、A、A、A、B、B、B、B をレンダリングする必要があります。

私は最悪のシナリオにあるようです。

私は多くの異なるテクスチャ (たとえば 50) を持っています。それらはすべて異なる画像の一部であり、すべてランダムにレンダリングされます。N テクスチャ スイッチに近いものになる可能性があります。ここで、N はレンダリングするオブジェクトの数です。

何か動作するようになったら、これを更新します:)。

編集2:

現在、同じ画像を指す 100 個のオブジェクトをレンダリングしています (つまり、テクスチャ スワップはありませんか?)。私はまだAndroidで約10 fpsを取得しており、デバッグログはまだ各フレームで言っています:

1 つのテクスチャが残ります 2 つのテクスチャが作成されます

何か重要なものが欠けているような気がします...助けてください:)。

4

1 に答える 1

0

いくつかのより深いテストの後、次のことがわかりました。

1) htc の欲求は、同じ画像を共有していても何百ものオブジェクトを描画する 60 fps を期待できません。

2) グループ レイヤーにアタッチされた imageLayer は、Android でより優れたパフォーマンスを提供するようです

3) レンダラー コールバックの開始時に surface.clear() を呼び出すと (即時レイヤーを使用)、描画のパフォーマンスが大幅に向上し、「作成されたテクスチャ」のデバッグ ログが削除されました。

4) 最後に、オブジェクトをテクスチャでソートし、テクスチャ スワップの数を減らす (ABABAB ではなく AAAABBB を描画する) と、より良い結果が得られました。

アプリは現在、画面上に約 500 個のオブジェクトを描画している場合、欲望では 30 fps で実行され、Galaxy S2 では 60 fps で実行されます。

于 2012-08-05T10:15:03.770 に答える