(これは、使用するサーバー ソフトウェアの制限によるものです。変更できる場合は変更します)。
ソケットを介して、一連の 720x480 JPEG ファイル (サイズ約 6kb) を受信しています。ネットワークのベンチマークを行ったところ、これらの JPEG を 60FPS でスムーズに受信できることがわかりました。
私の現在の描画操作は、2560x1600 の Nexus 10 ディスプレイで行われています。ソケットからバイト配列を受け取ったら、これが私のデコード方法です。
public static void decode(byte[] tmp, Long time) {
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferQualityOverSpeed = false;
options.inDither = false;
Bitmap bitmap = BitmapFactory.decodeByteArray(tmp, 0, tmp.length, options);
Bitmap background = Bitmap.createScaledBitmap
(bitmap, MainActivity.screenwidth, MainActivity.screenheight, false);
background.setHasAlpha(false);
Canvas canvas = MainActivity.surface.getHolder().lockCanvas();
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(background, 0, 0, new Paint());
MainActivity.surface.getHolder().unlockCanvasAndPost(canvas);
} catch (Exception e) {
e.printStackTrace();
}
}
ご覧のとおり、SurfaceView からキャンバスをクリアしてから、ビットマップを SurfaceView に描画しています。私の問題は、それが非常に、非常に、遅いということです。
ロック操作の前後に System.currentTimeMillis() を追加することに基づく一部のテストでは、キャンバスの取得、ビットマップの描画、キャンバスの押し戻しの間に約 30 ミリ秒の差が生じます。表示される SurfaceView は非常にラグがあり、時々ジャンプしたり、フレーム レートがひどいです。
このように描くための参照方法はありますか?繰り返しますが、サーバーから取得したものを変更することはできませんが、可能であればビットマップを 60FPS で表示したいと考えています。
(ImageView の内容を設定しようとしましたが、同様の結果が得られています)。これに影響を与える可能性のある SurfaceView のコードは他にありません。ホルダーを RGBA_8888 形式に設定しました。
getHolder().setFormat(PixelFormat.RGBA_8888);
このビットマップのストリームを VideoView に変換することは可能ですか? その方が速いでしょうか?
ありがとう。