(这是由于我将使用的服务器软件的限制,如果我可以更改它,我会)。
我正在通过套接字接收一系列 720x480 JPEG 文件(大小约为 6kb)。我对网络进行了基准测试,发现我能够以 60FPS 顺利接收这些 JPEG。
我当前的绘图操作是在 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?那会更快吗?
谢谢。