我整晚都在与Android性能作斗争并且可能解决了我一直在处理的问题,但是我仍然很困惑并且可以使用一些帮助.考虑这两个样本之间的时间差异.
第一个示例加载到可绘制的位图中并创建它的可变副本
Bitmap cacheBitmap;
Canvas cacheCanvas;
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
if (cacheBitmap != null) {
cacheBitmap.recycle();
}
Resources res = getContext().getResources();
Bitmap blankImage = BitmapFactory.decodeResource(res, R.drawable.blank);
/* copy existing bitmap */
cacheBitmap = Bitmap.createScaledBitmap(blankImage, w, h, false);
/* copy existing bitmap */
cacheCanvas = new Canvas();
cacheCanvas.setBitmap(cacheBitmap);
cacheCanvas.drawRGB(255, 255, 255);
}
public void onDraw(Canvas canvas) {
canvas.drawBitmap(cacheBitmap, 0, 0, null); // draws in 7-8 ms
}
Run Code Online (Sandbox Code Playgroud)
第二个示例创建一个新的位图而不复制原始空白图像.
Bitmap cacheBitmap;
Canvas cacheCanvas;
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
if (cacheBitmap != null) {
cacheBitmap.recycle();
}
Resources res = getContext().getResources();
Bitmap blankImage = BitmapFactory.decodeResource(res, R.drawable.blank);
/* create fresh bitmap */
cacheBitmap = Bitmap.createBitmap(w, h, blankImage.getConfig());
/* create fresh bitmap */
cacheCanvas = new Canvas();
cacheCanvas.setBitmap(cacheBitmap);
cacheCanvas.drawRGB(255, 255, 255);
}
public void onDraw(Canvas canvas) {
canvas.drawBitmap(cacheBitmap, 0, 0, null); // draws in 40 ms
}
Run Code Online (Sandbox Code Playgroud)
第一个样本比第二个样本快5-6倍,为什么会这样?我希望能够以某种方式编写此代码,甚至不依赖于空白图像,但无论我做什么,我最终都会得到一个缓慢的位图绘制,而不是最初可以复制它.
检查位图的格式。在旧版本的 Android 中,存在一个错误(功能?),在使用某些函数创建位图时,对于不带 alpha 的位图,始终使用 565,对于带 alpha 的位图,始终使用 8888。
我很想说,不知何故,一个版本使用 8888,而另一个版本使用 565,从而提高速度。
用于getConfig研究两个位图。
| 归档时间: |
|
| 查看次数: |
7844 次 |
| 最近记录: |