我正在为Android开发动态壁纸。该代码有效,但是我遇到了性能问题。基本上,我正在绘制位图并移动它们。带有15张小图像,效果很好。但是,随着50张较大的图片,它开始滞后。
在移动的对象中,我正在构造器中创建位图,并显示如下:
public void drawFrame(Canvas canvas) {
Position p = movingStrategy.move();
Matrix matrix = new Matrix();
matrix.postScale(scale, scale);
matrix.postRotate(p.getRotation());
matrix.postTranslate(p.getPositionX(), p.getPositionY());
canvas.drawBitmap(bitmap, matrix, paint);
}
在我的墙纸服务中,我这样调用onDraw:
private void draw() {
handler.removeCallbacks(drawRunner);
SurfaceHolder holder = getSurfaceHolder();
Canvas canvas = null;
try {
canvas = holder.lockCanvas();
if (canvas != null) {
canvas.save();
canvas.drawColor(Color.BLACK);
for (DrawElement element : elements) {
element.drawFrame(canvas);
}
canvas.restore();
}
} finally {
if (canvas != null)
holder.unlockCanvasAndPost(canvas);
}
if (visible) {
handler.postDelayed(drawRunner, 1);
}
}
我尝试将其与普通View一起使用,它是onDraw,并且在这里工作正常。非常顺利。现在,我在问自己如何改善性能。我还尝试了不同的delayMillis,但性能没有提高。
我也听说过GLWallpaperService,但是绘制简单的位图似乎很复杂。所以我想改用Canvas。
谢谢
编辑:
我已经测试了视图和服务之间的性能。这部分:
long start = System.currentTimeMillis();
for (DrawElement element : elements) {
element.drawFrame(canvas);
}
Log.e("DrawingTime", Long.toString(System.currentTimeMillis()-start));
在0-1ms的范围内进行查看,在50到300ms之间进行服务。
答案 0 :(得分:0)
性能实际上取决于位图有多大,如何分配和解除位图,使用哪个位图配置以及运行应用程序的API。
检查以下有用的东西:
https://developer.android.com/topic/performance/graphics/ https://developer.android.com/topic/performance/graphics/manage-memory https://developer.android.com/topic/performance/graphics/cache-bitmap
答案 1 :(得分:0)
您应该使用压缩纹理进行恶意攻击! IE:etc1&etc2
可以使用png或jpeg,但是它们使用cpu性能来快速处理和耗尽电池。