我正在开发视频流应用。这是一个特殊情况,我需要手动处理每个帧(从网络访问到解码和其他处理)。在我的所有流程结束时,对于每个框架,我都有byte[]
包含ARGB_8888
编码图像。
现在,我以这种方式绘制每个帧(假设 width = 1280且 height = 720,而 data 是我的{{1包含框架, imageView 是我的byte[]
容器)
ImageView
一切正常,没问题。但我有很多GC,我真的不喜欢每次为每个相同尺寸的框架创建一个新的// Step 1: reception and treatments
// After that, data contains the frame bytes;
// Step 2: bitmap creation
Bitmap toDraw = Bitmap.createBitmap(1280, 720, Bitmap.Config.ARGB_8888);
toDraw.copyPixelsFromBuffer(ByteBuffer.wrap(data));
// Step 3: draw the bitmap
imageView.post(new Runnable() {
@Override
public void run()
{
imageView.setImageBitmap(toDraw);
}
});
!所以我需要知道如何优化帧渲染?我知道我可以在第一次调用Bitmap
然后只使用createBitmap
来填充它(即使它复制了我也不喜欢它但是它更好)。一个直观的解决方案来找我,但我不知道它是否可能:
如果我是第一次创建并绘制copyPixelsFromBuffer
,然后检索Bitmap
中的像素并对其进行修改或直接修改或将imageView
作为参考,该怎么办?我搜索了data
,但没有找到解决方案。
否则,任何想法都比这个代码更好(通过更好的意思是内存友好和更快)?问题是:快速更新DrawingCache
提供已解码的imageView
数据(每帧)的最佳方法是什么。
答案 0 :(得分:1)
你可以只在需要时创建位图,如果它是null或者它的大小不正确
Bitmap mBitmap;
private void someMethod(){
if(mBitmap == null || !isBitmapSizeOk(mBitmap)){
if(mBitmap != null) mBitmap.recycle();
mBitmap = Bitmap.createBitmap(1280, 720, Bitmap.Config.ARGB_8888);
// call it only when the Bitmap instance changes
imageView.setImageBitmap(mBitmap);
}
mBitmap.copyPixelsFromBuffer(ByteBuffer.wrap(data));
// Step 3: draw the bitmap
imageView.post(new Runnable() {
@Override
public void run(){
imageView.invalidate();
}
});
}
你只能在创建Bitmap时调用setImageBitmap(mBitmap)并避免每次都调用它,但是,ImageView需要知道它必须重绘自己,你可以通过调用invalidate()