2012.08.03 21:28
czy na Androidzie szybciej narysować jeden duży czy kilka małych
Zastanawiałem się wczoraj, czy na Androidzie szybciej rysuje się (przez Canvas.drawBitmap) jeden duży obrazek czy kilka małych obrazków (o łącznie tej samej powierzchni). Zmierzyłem i wyszło mi, że narysowanie jednego obrazka o rozmiarach 200x200 pikseli zajmuje od 2 do 21 ms, średnio 2.681 ms (mierzyłem czas prawdziwy, nie czas procesora - odejmowałem timestamp z po i przed narysowania). A narysowanie stu obrazków o rozmiarach 20x20 pikseli (więc łącznie mających tę samą powierzchnię) zajmuje od 5 do 63 ms, średnio 6.9265 ms. Więc wychodzi, że szybciej się rysuje jeden duży obrazek niż kilka małych. Potem sprawdziłem, czy prawdą jest, co mówią ludzie, że szybciej się rysuje, jeśli obrazek nie ma przezroczystości. Mi wyszło, że tak samo szybko rysują się obrazki z przezroczystością i bez przezroczystości (nawet jeśli te obrazki częściowo na siebie nachodzą). Potem sprawdziłem, czy prawdą jest, co mówią ludzie, że szybkość rysowania zależy od tego, w jakim formacie jest obrazek (robiłem coś jak obrazek.copy(Config.ARGB_4444, false)). Mi wyszło dziwnie - przy rysowaniu pojedynczego obrazka różnica była (format RGB_565 rysował się najszybciej, od 0 do 17 ms, średnio 1.154 ms), a przy rysowaniu wielu małych obrazków różnicy nie było.
Oto źródło:
package pl.xxx.testrysowania;
import java.util.Date;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;
public class MojWidok extends View {
private final Paint paint = new Paint();
private final Bitmap obrazek;
private final long[] czasy = new long[2000];
private int i = 0;
private boolean koniec = false;
public MojWidok(Context context) {
super(context);
obrazek = BitmapFactory.decodeResource(context.getResources(), R.drawable.test_200_200).copy(Config.ARGB_4444, false);
//obrazek = BitmapFactory.decodeResource(context.getResources(), R.drawable.test_20_20_alfa);
}
@Override
protected void onDraw(Canvas canvas) {
if (koniec) return;
Date teraz = new Date();
// for (int x = 0; x < 10; x++) {
// for (int y = 0; y < 10; y++) {
// canvas.drawBitmap(obrazek, 10 * x, 10 * y, paint);
// }
// }
canvas.drawBitmap(obrazek, 10, 10, paint);
Date potem = new Date();
if (i < czasy.length) {
czasy[i++] = (potem.getTime() - teraz.getTime());
invalidate();
} else {
long suma = 0;
long max = 0;
long min = Long.MAX_VALUE;
for (long czas: czasy) {
suma += czas;
if (czas < min) min = czas;
if (czas > max) max = czas;
}
System.out.println("sredni czas: " + (((double) suma) / czasy.length));
System.out.println("najkrótszy czas: " + min);
System.out.println("najdłuższy czas: " + max);
koniec = true;
}
}
}
komentarze:
powrót na stronę główną
RSS