Ich habe das:
%Vor%Ich vergrößere das Bild auf eine größere Größe, nicht kleiner.
Ohne Größenänderung, funktioniert sehr gut, Leistung 100%
bitmap1 = getImage("bitmap1");
...
bitmap20 = getImage("bitmap20");
Mit Größenanpassung, Leistung 80%
bitmap1 = getImage("bitmap1");
...
bitmap20 = getImage("bitmap20");
called once, when screen width and height are known
bitmap1 = resizeImage(bitmap1);
...
bitmap20 = resizeImage(bitmap20);
Ohne Größenanpassung, Leinwandskalierung, Leistung 40%
bitmap1 = getImage("bitmap1");
...
bitmap20 = getImage("bitmap20");
set canvas.scale(scale, scale) inside draw() method
Ich weiß, dass es einige Frameworks wie libgdx gibt, die die Größe von Bildern ändern, ohne die Leistung zu verlieren, aber ich benutze native Canvas.
Frage : Wie zeichne ich skalierte Bilder mit 100% Leistung?
UPDATE Versucht, min Probe zu machen.
mWallpaperService.java
%Vor%MainActivity.java
%Vor% Versuchen Sie Canvas.drawBitmap (Bitmap bitmap, null, Rect dst, Paint paint)
Die Größe des "dst" -Ecks bestimmt den Maßstab, die Bitmap wird angepasst, damit sie hineinpasst. Das native ImageView verwendet es also sollte es ziemlich schnell sein.
Der Leistungsabfall scheint von Bitmap.createBitmap (CPU-Größenänderung) auszugehen. Ich denke, für Ihren Fall gibt es keinen Grund, Bitmap mit Bitmap.createBitmap zu skalieren. Stattdessen sollten Sie es über GPU tun.
Ihr Größenänderungscode, Bitmap.createBitmap, führt eine Größenanpassung der CPU-Bitmap durch: Speicher für neues Bitmap zuweisen - Interpolation von der alten Bitmap durchführen, neue Bitmap füllen - alles erledigt von der CPU.
Der viel bessere Ansatz besteht darin, Bitmap zu behalten, ohne die Größe der CPU zu ändern. Laden Sie stattdessen die gesamte Bitmap in die GPU und weisen Sie GPU an, die Größe zu ändern. ZB, verwenden Sie:
drawBitmap (Bitmap-Bitmap, Matrixmatrix, Farbe malen)
Zeichnen Sie die Bitmap mit der angegebenen Matrix.
Sie können den Matrix-Parameter als Größenänderungsmatrix für die Bitmap verwenden, die gezeichnet wird.
Wenn Sie ein Problem mit der Speicherbelegung haben (z. B. wenn die ursprüngliche Bitmap zu groß ist), können Sie die Größe (mit Bitmap.createBitmap, CPU resize) einmal verringern, wenn Sie sie in den Speicher laden. Und es ist nicht nötig, die Größe in onSurfaceChanged zu ändern (Sie müssen wahrscheinlich die Größe der Matrix neu berechnen).