我试图为Bitmap对象创建一个简单的平移运动。我通过创建一个画布并向其传递一个帧缓冲区来实现这一点,该帧缓冲区之前已被初始化为1080/1920的分辨率。然后我继续绘制一个位图,调用画布'方法drawBitmap()如下:
this.canvas = new Canvas(frameBuffer);
...
canvas.drawBitmap(bitmap, null, destinationRect, paint);
在另一个设置为主要活动的内容视图的线程中,我将缩放帧缓冲区以适应实际的屏幕大小,然后使用以下行绘制所有内容:
Canvas canvas = holder.lockCanvas();
canvas.getClipBounds(dstRect);
...
canvas.drawBitmap(framebuffer, null, dstRect, paint);
holder.unlockCanvasAndPost(canvas);
这导致性能非常差,无论是使用增量时间手动测量还是使用Android Studio工具进行监控。即使在视觉上你也可以在位图后面看到一个跟踪非常低的fps。
我似乎无法找到原因,但我怀疑drawBitmap隐式执行的缩放过程是做了很多事情。我尝试更改过滤器设置但没有成功。我也怀疑我应该为这个简单的需求寻找openGL。
我应该使用不同大小的位图,并决定运行时最接近我需要的大小,还是有更直接的解决方案来解决这个问题?
编辑: 以下是使用matrix.postScale()方法每秒获得更多帧数的方法:
int width = framebuffer.getWidth();
int height = framebuffer.getHeight();
float scaleWidth = ((float) game.size.x) / width;
float scaleHeight = ((float) game.size.y) / height;
// create a matrix for the manipulation
Matrix matrix = new Matrix();
// resize the bit map
matrix.postScale(scaleWidth, scaleHeight);
// recreate the new Bitmap
Bitmap resizedBitmap = Bitmap.createBitmap(framebuffer, 0, 0, width, height, matrix, true);
canvas.drawColor(Color.parseColor("#013501"));
canvas.drawBitmap(resizedBitmap, null, dstRect, paint);
holder.unlockCanvasAndPost(canvas);