低帧率将位图写入canvas

我有一个动态壁纸,通过将每个帧绘制到canvas来运行循环动画。 我有一个单一的图像,大小与屏幕的确切尺寸相同。 我有一组400帧,大小恰好适合屏幕的底部三分之一; 这是动画发生的地方。 以下是显示它们的代码:

public void updateBG() { mHandler.removeCallbacks(mUpdateDisplay); if (mVisible) { mHandler.postDelayed(mUpdateDisplay, 40); } if (imagesLoaded  0 || animEndX > 0 || animStartY > 0 || animEndY > 0) { c.drawBitmap(BitmapFactory.decodeByteArray(bitmapArray[totalFrames], 0, bitmapArray[totalFrames].length), null, destinationRect, p); Rect destinationRectAnim = new Rect(); destinationRectAnim.set(animX, animY, animX+animWidth, animY+animHeight); c.drawBitmap(BitmapFactory.decodeByteArray(bitmapArray[bgcycle], 0, bitmapArray[bgcycle].length), null, destinationRectAnim, p); } else { c.drawBitmap(BitmapFactory.decodeByteArray(bitmapArray[bgcycle], 0, bitmapArray[bgcycle].length), null, destinationRect, p); } } } finally { if (c != null) holder.unlockCanvasAndPost(c); } bgcycle++; } } 

此代码在Xperia Ion(双核1.5 GHz cpu)上以大约10-12 FPS运行,在较旧的设备上更差。 当我以一半的屏幕分辨率保存整个帧时,情况会好得多。 当我开始在屏幕分辨率上使用全帧时,它实际上变得更糟(这应该消除了在每帧上插值的需要)。 当我开始使用这个代码时,它会变得更糟,这个代码写了两个位图(大概是因为它无法保存上一次运行的canvas的上半部分)。

我该如何优化呢? 我宁愿不保存全帧,因为只保存每帧的动画部分确实减少了内存使用量。 这里感觉真的很不对劲,特别是考虑到它背后有3GHz的功率运行。 我以前在450 MHz奔腾III上观看电影。 有什么明显的东西我做错了吗? 即使手机尺寸正确,手机是否仍在尝试插入图像?

您正在每帧上解码您的位图,它很昂贵,它会产生垃圾,触发GC。 您还使用软件渲染进行渲染。 以下是您的解决方案:

  • 不要在每帧上重新解码位图
  • 重用位图对象(请参阅BitmapFactory.Options.inBitmap)
  • 使用硬件加速(直接渲染到View而不是SurfaceView。)软件插值非常昂贵。