android Hintergrundbild verlangsamt App

7

Ich verwende einen Viewpager, um zwischen Fragmenten in meiner App zu wischen. Ich definiere den Hintergrund im XML, also

%Vor%

Wenn ich eine einfache Hintergrundfarbe verwende, funktioniert meine App sehr flüssig. Wenn ich es mit diesem Hintergrundbild verwende, werden fps kleiner und meine App wird nur noch passierbar. Es ist nicht langsam, nur nicht so glatt, aber auf schwächeren Geräten könnte es Laggy funktionieren. Ist es eine schlechte Methode, ein Hintergrundbild zu erstellen? Das ganze Bild ist ein 480x800 png mit der Größe von 14.7kB. Was könnte das Problem sein?

(die Hintergründe der Fragmente sind transparent, der Viewpager befindet sich in einer main.xml, die mit diesem Bild hinterlegt ist)

    
Jani Bela 10.01.2013, 23:30
quelle

6 Antworten

9

Es gibt viele Antworten, die darauf hindeuten, dass Sie Ihre Bitmap vorskalieren. Dies ist sehr wichtig und Sie sollten es tun, wenn Sie können, aber nach dem Versuch, mehrere verschiedene Dinge, der größte Leistungsgewinn, den ich erlebt habe, war eine Sicht zu erstellen und überschreiben die OnDraw-Methode.

Die Klasse könnte so einfach sein:

%Vor%

Rufen Sie den Code mit einer vorskalierten Bitmap auf:

%Vor%

An dieser Stelle können Sie diese Ansicht der Ansichtshierarchie hinzufügen, zu der sie gehört. In meinem Fall hatte meine Ansichtshierarchie eine bgImage, einen mittleren Grund, wo alle anderen Funktionen stattfanden, und fgImage.

Verwenden Sie den Androiden-SDK-Werkzeughierarchie-Viewer, um die App zu profilieren und zu sehen, wie schnell jede Ansicht zum Zeichnen benötigt. Meine App verbrachte 30 bis 40ms mit dem Zeichnen von bgImage und fgImage. Durch das Vorskalieren und Überschreiben von onDraw wurde diese um 30 bis 40 ms auf etwa 1,5 ms reduziert.

Hier ist ein Screenshot der Draw Performance für eine meiner Ansichten davor und danach:

VOR:

NACH:

    
Christopher Rathgeb 28.08.2013 03:59
quelle
7

Ich bin ein bisschen spät, aber das hat mich nur umgehauen, und als ich den GPU-Debugger startete, bemerkte ich, dass das System mein Image hochskalierte! Ich hatte ein 1920x1080 Bild, und es zeigte sich als 3780x6720 Textur!

Idealerweise sollten Sie Texturen für jede Dichte im jeweiligen Ordner haben ( res/drawable-mdpi , res/drawable-hdpi , usw.).

Wenn Sie jedoch denken, dass Ihre eine Textur in Ordnung ist, fügen Sie sie in res/drawable-nodpi , nicht res/drawable ein. Wenn Sie es in res/drawable-nodpi eingeben, skaliert das System es nicht basierend auf der dpi.

In meinem Fall hat es eine einfache Benutzeroberfläche von 10 fps auf einem Pixel XL auf die volle Bildrate von 60 fps geändert.

    
EboMike 23.11.2016 05:28
quelle
3

Ich hatte ein Hintergrundbild, nicht groß, aber mit seltsamen Dimensionen - daher die Dehnung und schlechte Performance. Ich habe eine Methode mit den Parametern Context, a View und einer drawbaren ID (int) erstellt, die der Bildschirmgröße des Geräts entspricht. Verwenden Sie dies in z. B. eine Fragments onCreateView, um den Hintergrund festzulegen.

%Vor%     
ZooMagic 21.03.2017 13:29
quelle
1

Der Grund dafür könnte sein, dass das Bild gestreckt wird und Android Probleme mit der Dehnung von Hintergrundbildern hat.

Stattdessen sollten Sie entweder das Hintergrundbild entweder durch eine Hintergrundfarbe ersetzen oder sehen Sie diese Antwort , um das Bild zu wiederholen anstatt zu strecken.

    
Oleg Vaskevich 11.01.2013 02:16
quelle
1

Ich hatte das gleiche Problem und habe es mit dieser Methode gelöst:

Fügen Sie Ihr Bild zum Ordner mipmap hinzu, der sich im Verzeichnis res befindet. Es fügt das Bild entsprechend seiner Dichte hinzu.

    
Ishan Fernando 06.06.2016 16:57
quelle
0

Erstellen Sie nur ein Hintergrundbild mit der Größe 1080x1920 und legen Sie es in Drawable-Nodpi-Ordner und das hat dieses Problem gelöst

    
Rajesh Nasit 13.07.2017 05:47
quelle