我有一个动态壁纸,通过将每个帧绘制到画布来运行循环动画。我有一个单一的图像,大小与屏幕的确切尺寸相同。我有一组400帧的大小,完全适合屏幕的底部三分之一;这是动画发生的地方。以下是显示它们的代码:
public void updateBG() {
mHandler.removeCallbacks(mUpdateDisplay);
if (mVisible) {
mHandler.postDelayed(mUpdateDisplay, 40);
}
if (imagesLoaded < totalFrames) {
ShowLoadingProgress();
} else {
SurfaceHolder holder = getSurfaceHolder();
Canvas c = null;
try {
c = holder.lockCanvas();
if (c != null) {
Paint p = new Paint();
p.setAntiAlias(true);
c.drawRect(0, 0, c.getWidth(), c.getHeight(), p);
Rect destinationRect = new Rect();
destinationRect.set(0, 0, canvasWidth, canvasHeight);
if (animStartX > 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的速度运行,而在旧设备上则更差。当我以屏幕分辨率的一半保存整个帧时,情况要好得多。当我开始在屏幕分辨率上使用全帧时,它实际上变得更糟(这应该消除了在每个帧上插值的需要)。当我开始使用这个代码时,它变得更糟,这个代码写了两个位图(大概是因为它无法保存上一次运行的画布的上半部分)。
如何优化此功能?我宁愿不保存全帧,因为只保存每帧的动画部分确实减少了内存使用量。这里感觉真的很不对劲,特别是考虑到它背后有3GHz的功率运行。我曾经在450 MHz Pentium III上观看电影。有什么明显的东西我做错了吗?即使手机尺寸正确,手机是否仍在尝试插入图像?
答案 0 :(得分:3)
您正在解码每个帧上的位图,它很昂贵,并且会产生会触发GC的垃圾。您还使用软件渲染进行渲染。以下是您的解决方案: