2015-04-22 6 views
9

Um die App-Leistung zu verbessern, stoße ich GPU Overdraw Problem. Nach Romain Guy's Artikel, hier sind die Grundfarben:Android: Draw Hintergrund ohne GPU OverDraw wie Whatsapp


  • Keine Farbe bedeutet, dass es keine Overdraw ist. Der Pixel wurde nur einmal gemalt. In diesem Beispiel können Sie sehen, dass der Hintergrund intakt ist.

  • Blau zeigt eine Überzeichnung von 1x an. Das Pixel wurde zweimal gemalt. Große blaue Bereiche sind akzeptabel (wenn das gesamte Fenster blau ist, können Sie eine Schicht entfernen.)

  • Grün bedeutet eine Überzeichnung von 2x. Der Pixel wurde dreimal gemalt. Mittlere Grünflächen sind akzeptabel, aber Sie sollten versuchen, sie zu optimieren.
  • Hellrot bedeutet eine Überziehung von 3x. Das Pixel wurde vier Mal gemalt. Kleine hellrote Bereiche sind akzeptabel.
  • Dunkelrot bedeutet eine Überzeichnung von 4x oder mehr. Der Pixel wurde 5 mal oder mehr gemalt. Das ist falsch. Fix it.`

Um das zu testen, erstelle ich ein einfaches Projekt mit XML als

XML-Code

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity" 

    android:layout_margin="50dp" 
    android:background="#fff"> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello_world"/> 

</RelativeLayout> 

und Ergebnis erhalten folgt:
n00b Me

Dann habe ich Whatsapps Overdra versucht w. Zu meiner Überraschung:
Awesome Whatsapp

So wie WhatsApp Hintergrund Tapete mit keine Überzeichnungs (keine blaue Färbung) zieht aber in meinem einfachen xml, sogar Färbung gibt eine Überzeichnungs??

PS: Ich habe Hintergrundfarbe absichtlich hinzugefügt zu zeigen, dass Farbe Zugabe gibt overdraw aber Tapete Zugabe nicht

Antwort

24

Jede Tätigkeit hat einen Standardhintergrund Drawable, der vom Attribut android:windowBackground des Themas kommt.

WhatsApp verwendet ein Hintergrundbild, das in beide Richtungen wiederholt werden kann, um den gesamten Bildschirm auszufüllen. Auf diese Weise müssen sie sich nicht mit verschiedenen Bildern für verschiedene Bildschirmgrößen auseinandersetzen - es ist super reaktionsfähig!

Also lassen Sie uns sagen, Sie haben so ein gekacheltes Bild (zB ziehbar-nodpi/background_tile.png)

Erstellen Sie einfach eine neue XML-Drawable (zB ziehbar/background.xml), die wie folgt aussieht:

<?xml version="1.0" encoding="utf-8"?> 
<bitmap xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/background_tile" 
    android:tileMode="repeat" /> 

nun einfach diese Drawable als Hintergrund für Themen- Ihre Aktivität suchen:

<style name="AppTheme" parent="Theme.AppCompat.Light"> 
    <item name="android:windowBackground">@drawable/background</item> 
</style> 

Sie auch den Hintergrund Drawable einer Aktivität zur Laufzeit miteinstellengetWindow().setBackgroundDrawable oder getWindow().setBackgroundDrawableResource

Sie können auch den Hintergrund Drawable zu null zum Beispiel festgelegt, wenn die ganze Aktivität eine MapView oder etwas Ähnliches zeigt.

Beachten Sie auch, dass der Zygote den Hintergrund des Designs während der Startphase der App Drawable verwendet, wenn die Aktivität Ihre Hauptstartaktivität ist.

1

denke ich, die ein Überzeichnungs Sie haben, ist der Hintergrund Ihrer RelativeLayout. Sie können das entfernen android:background="#fff" der Hintergrund wird je nach App-Thema einmal gezeichnet werden.

+0

Ich habe absichtlich Hintergrundfarbe hinzugefügt, um zu zeigen, dass das Hinzufügen von Farbe Overdraw gibt, aber das Hinzufügen von Hintergrundbildern nicht – Aexyn

+0

es ist nur eine wilde Vermutung kann meine machen den Hintergrund der Aktivität als transparent im Thema können wir eine Überziehung reduzieren. –

2

Bill Gates ‚s Hinweis Auftragen, es stellt sich heraus Hintergrund Einstellung in styles.xml in App speichert tatsächlich eine Überzeichnungs.Dieser Code speichert eine Überzeichnungs

<resources> 

    <!-- Base application theme. --> 
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
     <!-- Customize your theme here. --> 
     <item name="android:windowBackground">@color/highlighted_text_material_dark</item> 
    </style> 

</resources> 

Jetzt Hintergrund Hinzufügen übernimmt keine Overdraw so Relative Layout ist noch One Overdraw

BackGround with no OverDraw

UPDATE die obige Methode funktioniert, und ist gut, wenn Sie wollen gleichen Farbhintergrund für alle Ihre App. Aber im Fall, dass Sie verschiedene Farben und wollen noch Overdraw speichern, über die Linie mit

One Step Further
Boom ersetzen .. Sie sind gut zu gehen ..

TIP: Wenn Ihre App hat schwarze Farbe als Hintergrund .. gehen Sie für es eine mehr Überziehung retten;)

+2

Ich würde nicht empfehlen, das windowBackground auf @null festzulegen, wenn die Stammansicht des Layouts keinen durchgehenden Hintergrund hat, da der Hintergrund der Aktivität nicht auf Schwarz gesetzt wird. Stattdessen wird es "nichts" sein, was eine Menge seltsamer Artefakte verursachen kann, sobald Sie Views animieren oder sich bewegen. – astuetz

+0

"Setzen Sie es stattdessen auf die Farbe/das Bild, die Sie wollen oder loswerden von onCreate() durch Aufruf von getWindow(). SetBackgroundDrawable (null)", nicht im Thema für die Root-Aktivität – superuser

+0

Ausgezeichnete Lösung @Aexyn vielen Dank. .. – Kushal

Verwandte Themen