私が開発しているゲームは進歩し、ますます多くの要素が追加されていますが、もちろん新しい問題に直面しています。その 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 を使用し、他のゲーム エンジンを使用していない理由です。