帆布' drawBitmap方法在缩放后导致性能不佳

时间:2018-05-01 06:49:58

标签: android canvas bitmap draw scaling

我试图为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);

0 个答案:

没有答案