use*_*661 5 android live-wallpaper android-canvas
我正在为Android的livewallpaper工作.代码有效,但我遇到了性能问题.基本上我正在绘制位图并移动它们.有15个小图像,它工作得很好.但是有50个更大的图像,它开始滞后.
在我的移动对象中,我在构造函数中创建了Bitmap并将其显示如下:
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);
}
Run Code Online (Sandbox Code Playgroud)
在我的wallpaperservice中,我正在调用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);
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用普通的View和它的onDraw,它在那里工作正常.它很顺利.现在我问自己如何改善性能.我也尝试了不同的delayMillis,但性能并没有增加.
我也听说过GLWallpaperService,但是绘制简单的Bitmaps似乎很复杂.所以我想改用Canvas.
谢谢
编辑:
我已经测试了视图和服务之间的性能.这部分:
long start = System.currentTimeMillis();
for (DrawElement element : elements) {
element.drawFrame(canvas);
}
Log.e("DrawingTime", Long.toString(System.currentTimeMillis()-start));
Run Code Online (Sandbox Code Playgroud)
在0到1ms的视图中,在50到300ms之间的服务中.
性能实际上取决于您的位图有多大、如何分配和取消分配它们、您使用哪个位图配置以及您在哪个 API 上运行应用程序。
检查这个有用的东西:
https://developer.android.com/topic/performance/graphics/ https://developer.android.com/topic/performance/graphics/manage-memory https://developer.android.com/topic/performance/graphics /缓存位图