0

私が開発しているゲームは進歩し、ますます多くの要素が追加されていますが、もちろん新しい問題に直面しています。その 1 つはパフォーマンスです。

現在、3 つのスレッドがあり、そのうちの 2 つは計算を実行し、もう 1 つはキャンバスを更新します。これら 3 つのスレッドは CyclicBarrier と同期され、キャンバスの描画を開始するときにすべての計算が終了します。

サイズの異なる複数のビットマップを使用しています。描画方法では、ビットマップは回転され(drawBitmap-matrixの組み合わせを使用して、「ネイティブ」(推測)管理のためにマトリックスにスケーリング/変換/回転が追加されます)、もちろん描画されます。私が直面している問題は、画面上に「移動および回転」する要素が多すぎると、途切れ途切れになることです。

Matrix matrix = new Matrix();
matrix.setTranslate(view.getX(), view.getY());
matrix.preScale((1.0f * view.getWidth() / view.getCurrentBitmap().getWidth()), (1.0f * view.getHeight() / view.getCurrentBitmap().getHeight()));
matrix.postRotate(view.getRotation(), view.getX() + view.getWidth()/2f, view.getY()  + view.getHeight()/2f);
mCanvas.drawBitmap(view.getCurrentBitmap(), matrix, mBasicPaint);

たとえば、これは、回転と位置に従ってプレーヤー オブジェクトがどのように描画されるかを示しています。

private void drawPlayer(final Canvas mCanvas) {
    final Bitmap playerBitmap = mPlayer.getCurrentBitmap();
    mPlayer.nextFrame();
    if(playerBitmap != null) {
        if(mPlayer.getRotation() != 0) {
            Matrix matrix = new Matrix();
            matrix.setTranslate(-mPlayer.getCurrentBitmap().getWidth()/2f, -mPlayer.getCurrentBitmap().getHeight()/2f);
            matrix.postRotate(mPlayer.getRotation());
            matrix.postTranslate(mPlayer.getX() +  + mPlayer.getCurrentBitmap().getWidth()/2f, mPlayer.getY()  + mPlayer.getCurrentBitmap().getHeight()/2f);
            matrix.postScale((1.0f * mPlayer.getWidth() / mPlayer.getCurrentBitmap().getWidth()), (1.0f * mPlayer.getHeight() / mPlayer.getCurrentBitmap().getHeight()), mPlayer.getX(), mPlayer.getY());
            mCanvas.drawBitmap(mPlayer.getCurrentBitmap(), matrix, mBasicPaint);
        } else {
            Matrix matrix = new Matrix();
            matrix.setScale((1.0f * mPlayer.getWidth() / mPlayer.getCurrentBitmap().getWidth()), (1.0f * mPlayer.getHeight() / mPlayer.getCurrentBitmap().getHeight()));
            matrix.postTranslate(mPlayer.getX(), mPlayer.getY());
            mCanvas.drawBitmap(mPlayer.getCurrentBitmap(), matrix, mBasicPaint);
        }
    } else log("bitmap = null!");
}

(これは非推奨バージョンの一種で、現在のバージョンでは .getCurrentBitmap() 呼び出しが 1 つに減っています。)

どうすればパフォーマンスを改善できますか? すべてのビットマップ (最大サイズ) と各ビットマップの事前に回転されたバージョンを事前にロードする、ある種の「読み込み中...」画面を作成する必要がありますか? (これは、2 ~ 4 度のステップを使用すると、各ビットマップのバージョンが 90 ~ 180 になり、かなり多くのように見えますか?) または、回転されたビットマップも保存されているので、多すぎるのでしょうか?想い出?私は OpenGL などについて何も知りません。これが、私が SurfaceView を使用し、他のゲーム エンジンを使用していない理由です。

4

1 に答える 1