【问题标题】:Performance difference between drawBitmap and createScaledBitmapdrawBitmap 和 createScaledBitmap 之间的性能差异
【发布时间】:2014-03-15 19:20:28
【问题描述】:

为了支持不同尺寸的屏幕分辨率,我使用 SurfaceView 以编程方式在我的 android 游戏应用程序中缩放位图。我使用drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint) 方法执行它。我看到了一个名为 createScaledBitmap 的Bitmap 方法,它可以创建一个从现有位图缩放的新位图。它们之间有性能差异吗?

【问题讨论】:

标签: android bitmap surfaceview drawbitmap


【解决方案1】:

创建缩放位图不会绘制位图。它提供了一种在绘图之前包含选项的方法。例如,您可以根据原始图像的大小、旋转等与将要绘制的位置使用不同的插值技术:

What does the filter parameter to createScaledBitmap do?

所以如果你对drawBitmap的结果不满意,你可以尝试通过缩放选项来改进Bitmap。 drawBitmap 使用“自动”缩放,但没有指定使用什么。

具体与性能相关,createScaledBitmap 使用本机方法“nativeCreate”,而 drawBitmap 使用“native_drawBitmap” - 因此它会因本机方法的平台实现而异。无论如何,一旦缩放位图,您就需要将其绘制到画布上,因此无论哪种方式都需要“drawBitmap”,即使位图已经缩放,也不太可能提高性能。但是,如果您不绘制它,那么使用“drawBitmap”就没有意义,因为它会自动缩放并使用资源来执行绘制。

【讨论】:

    【解决方案2】:

    是的,有。他们做不同的事情。 createScaledBitmap 采用位图并在内存中创建一个新的缩放副本。它不会将它放在画布上,这是一个新的位图对象,以后可以绘制到画布上。 drawBitmap 将位图绘制到画布(可能由位图、表面或屏幕支持)、对其进行缩放、应用来自绘制对象的效果、遵守剪辑区域等。

    除非您真的想将它绘制到画布上,否则不应使用 drawBitmap - 仅使用它来缩放是低效的。如果您需要绘制它并缩放它 - 如果您需要重复缩放它并且内存不是问题,请先使用 createScaledBitmap 然后绘制该缩放位图。如果您不需要再次绘制它或者内存存在问题,请在绘制时使用 drawBitmap 对其进行缩放。

    【讨论】: