android rendu et performance - 17 avril 2012

82
Lisse comme du beurre Romain Guy, Google @romainguy http://www.curious-creature.org/+

Upload: paris-android-user-group

Post on 24-May-2015

1.407 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Android rendu et performance - 17 avril 2012

Lisse comme du beurreRomain Guy, Google

@romainguyhttp://www.curious-creature.org/+

Page 2: Android rendu et performance - 17 avril 2012

Lisse comme du beurreRomain Guy, Google

@romainguyhttp://www.curious-creature.org/+

Page 3: Android rendu et performance - 17 avril 2012

Lisse comme du beurreRomain Guy, Google

@romainguyhttp://www.curious-creature.org/+

Android,����������� ������������������  rendu����������� ������������������  et����������� ������������������  performance

Page 4: Android rendu et performance - 17 avril 2012

Qui suis-je ? Pourquoi moi ?

• Android depuis 2007• Tech-lead du UI toolkit• Je parle beaucoup• J’ai le micro

Page 5: Android rendu et performance - 17 avril 2012

Ordre du jour

• UI thread• Views• Animations• Rendu• Mémoire

Page 6: Android rendu et performance - 17 avril 2012

UI thread

• Ne le bloquez pas !– Évitez les I/O, lourds calculs, etc.

• Mais manipulez la UI depuis ce thread– View.post(Runnable)

– Handler

Page 7: Android rendu et performance - 17 avril 2012

1: StrictMode.setThreadPolicy(2: new StrictMode.ThreadPolicy.Builder()3: .detectAll()4: .penaltyDeath()5: .build());

StrictMode

Page 8: Android rendu et performance - 17 avril 2012

1: StrictMode.setThreadPolicy(2: new StrictMode.ThreadPolicy.Builder()3: .detectAll()4: .penaltyDeath()5: .build());

StrictMode

Page 9: Android rendu et performance - 17 avril 2012

Tâches de fond

1: new Thread(new Runnable() {2: public void run() {3: // Opération4: }5: }).start();

Page 10: Android rendu et performance - 17 avril 2012

AsyncTask

1: LoadPhotos task =2: new LoadPhotos().execute("romainguy");

Page 11: Android rendu et performance - 17 avril 2012

1: class LoadPhotos extends AsyncTask<String, Bitmap, PhotoList> { 2: protected PhotoList doInBackground(String... params) { 3: PhotoList photos = Picasa.loadPhotos(params[0]); 4: for (int i = 0; i < photos.getCount(); i++) { 5: publishProgress(photos.get(i).loadSmallBitmap()); 6: } 7: return photos; 8: } 9: 10: protected void onProgressUpdate(Bitmap... values) {11: addPhotoToGrid(values[0]);12: }13: 14: protected void onPostExecute(PhotoList result) {15: setPhotoList(result);16: }17: }

Page 12: Android rendu et performance - 17 avril 2012

Solution parfaite ?

1: ToggleButton t = (ToggleButton) findViewById(R.id.switchOnOff); 2: t.setOnCheckedChangeListener(new OnCheckedChangeListener() { 3: public void onCheckedChanged(CompoundButton b, boolean isChecked) { 4: new Thread(new Runnable() { 5: public void run() { 6: prefs.edit().putBoolean("switch", isChecked)).commit(); 7: } 8: }).start(); 9: }10: });

Page 13: Android rendu et performance - 17 avril 2012

Solution parfaite ?

1: ToggleButton t = (ToggleButton) findViewById(R.id.switchOnOff); 2: t.setOnCheckedChangeListener(new OnCheckedChangeListener() { 3: public void onCheckedChanged(CompoundButton b, boolean isChecked) { 4: new Thread(new Runnable() { 5: public void run() { 6: prefs.edit().putBoolean("switch", isChecked)).commit(); 7: } 8: }).start(); 9: }10: });

Page 14: Android rendu et performance - 17 avril 2012

Ordre d’exécution

UI Thread Thread 1 Thread 2

Switch on

Switch off

Page 15: Android rendu et performance - 17 avril 2012

Ordre d’exécution

• Processeurs 2/4 coeurs communs• AsyncTask

– Sérialisée depuis Android 3.0

– executeOnExecutor()

Page 16: Android rendu et performance - 17 avril 2012

Une View est coûteuse

Page 17: Android rendu et performance - 17 avril 2012

Tem

ps

Nombre d’attributs XML

Inflation

Page 18: Android rendu et performance - 17 avril 2012

TextView = 800 octets

Poids d’une structure sans les données

Page 19: Android rendu et performance - 17 avril 2012

Layouts

• Coûts supplémentaires d’exécution • La mise en page est coûteuse– RelativeLayout

– android:layout_weight

• N’appelez pas requestLayout() souvent

Page 20: Android rendu et performance - 17 avril 2012

Aplatissez vos layouts

Page 21: Android rendu et performance - 17 avril 2012

<ViewStub />

Page 22: Android rendu et performance - 17 avril 2012

class MyView extends View

Page 23: Android rendu et performance - 17 avril 2012

new

Page 24: Android rendu et performance - 17 avril 2012

new

Page 25: Android rendu et performance - 17 avril 2012

Utilisez les outils !

traceview, hierarchyviewer, DDMS & lint

Page 26: Android rendu et performance - 17 avril 2012

View.setLayerType(int type, Paint p)

Page 27: Android rendu et performance - 17 avril 2012

DrawPatch

Button

Display

Save

ClipRect

Translate

DrawText

Restore

draw()DisplayList

Page 28: Android rendu et performance - 17 avril 2012

DrawPatch

Button

Display

Save

ClipRect

Translate

DrawText

Restore

draw()DisplayList Layer

draw()

Page 29: Android rendu et performance - 17 avril 2012

3 sortes de layers

view.setLayerType(View.LAYER_TYPE_NONE, null)

Page 30: Android rendu et performance - 17 avril 2012

Layer software

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null)

Page 31: Android rendu et performance - 17 avril 2012

Layer hardware

view.setLayerType(View.LAYER_TYPE_HARDWARE, null)

Page 32: Android rendu et performance - 17 avril 2012

Dessin d’une ListViewDessin d’une ListViewDessin d’une ListView

Temps en ms

Layer hardware DisplayList Software

0.009 2.1 10.3

Page 33: Android rendu et performance - 17 avril 2012

Propriétés pour transformer les vues

Opacité Position Taille Rotation Origine

alpha x scaleX rotation pivotX

y scaleY rotationX pivotY

translationX rotationY

translationY

Page 34: Android rendu et performance - 17 avril 2012

Propriétés de transformation

• Ne changent pas la vue• Changent comment elle se dessine• Propices à de nombreuses optimisations

Page 35: Android rendu et performance - 17 avril 2012

Optimisation des propriétés

ViewRoot

ViewGroup

View A View B

DisplayList

Layer B DisplayList A

Page 36: Android rendu et performance - 17 avril 2012

Optimisation des propriétés

ViewRoot

ViewGroup

View A View B

setRotationY(45)

DisplayList

Layer B DisplayList A

Page 37: Android rendu et performance - 17 avril 2012

Optimisation des propriétés

ViewRoot

ViewGroup

View A View B

setRotationY(45)

invalidate()

DisplayList

Layer B DisplayList A

Page 38: Android rendu et performance - 17 avril 2012

Optimisation des propriétés

ViewRoot

ViewGroup

View A View B

setRotationY(45)

invalidate()

DisplayList

Layer B DisplayList A

mark dirty

Page 39: Android rendu et performance - 17 avril 2012

Optimisation des propriétés

ViewRoot

ViewGroup

View A View B

setRotationY(45)

invalidate()

DisplayList

Layer B DisplayList A

mark dirty

Page 40: Android rendu et performance - 17 avril 2012

Dure réalité

• Les layers ne sont pas gratuits– Coût mémoire important

– Créer ou rafraîchir un layer prend du temps

• Utilisez les temporairement– Vues complexes

– Pour la durée d’une animation

Page 41: Android rendu et performance - 17 avril 2012

“Property animations”

Page 42: Android rendu et performance - 17 avril 2012

Nouvelles animations

• Animez une propriété– Objet cible

– Nom de la propriété

– Paramètres de valeurs

• Marche avec toute paire get/set

Page 43: Android rendu et performance - 17 avril 2012

1: ObjectAnimator.ofFloat(view, "alpha", 0);2: 3: ObjectAnimator.ofFloat(colorDrawable,4: "color", Color.WHITE, Color.BLACK);5: 6: ObjectAnimator.ofFloat(view, View.X, 200);

Page 44: Android rendu et performance - 17 avril 2012

1: view.setLayerType(View.LAYER_TYPE_HARDWARE, null); 2: ObjectAnimator.ofFloat( 3: view, View.ROTATION_Y, 180).start();

Page 45: Android rendu et performance - 17 avril 2012

1: view.setLayerType(View.LAYER_TYPE_HARDWARE, null); 2: ObjectAnimator animator = ObjectAnimator.ofFloat( 3: view, View.ROTATION_Y, 180); 4: 5: animator.addListener(new AnimatorListenerAdapter() { 6: @Override 7: public void onAnimationEnd(Animator animation) { 8: view.setLayerType(View.LAYER_TYPE_NONE, null); 9: }10: });11: 12: animator.start();

Page 46: Android rendu et performance - 17 avril 2012

Mais il y a mieux !

Page 47: Android rendu et performance - 17 avril 2012

ViewPropertyAnimator

• Plus facile• Plus rapide• Pas de JNI ni de reflection• Optimise les invalidate()

Page 48: Android rendu et performance - 17 avril 2012

1: view.animate().alpha(0);2: 3: view.animate().translationX(500);4: 5: view.animate().alpha(0).translationX(500);

Page 49: Android rendu et performance - 17 avril 2012

view.animate().rotationY(180).withLayer();

Page 50: Android rendu et performance - 17 avril 2012

view.animate().rotationY(180).withLayer();

Page 51: Android rendu et performance - 17 avril 2012

Ce t te API pourrai t ou ne

pourrait pas se retrouver dans

une future version d’Android

qui ne pourrait elle-même peut

être pas exister. Mais ça serait

bien.

Page 52: Android rendu et performance - 17 avril 2012

Mémoire

Page 53: Android rendu et performance - 17 avril 2012

$ adb shell dumpsys meminfo <process>

Page 54: Android rendu et performance - 17 avril 2012

1 of 2

** MEMINFO in pid 1523 [com.example.android.sample] ** Shared Private Heap Heap Heap Pss Dirty Dirty Size Alloc Free ------ ------ ------ ------ ------ ------ Native 3260 944 3220 9960 6359 20 Dalvik 6952 15612 6344 21319 16224 5095 Cursor 0 0 0 Ashmem 0 0 0 Other dev 12583 660 1096 .so mmap 1149 1812 352 .jar mmap 0 0 0 .apk mmap 114 0 0 .ttf mmap 7 0 0 .dex mmap 807 0 0 Other mmap 44 8 28 Unknown 1439 356 1424 TOTAL 26355 19392 12464 31279 22583 5115

Page 55: Android rendu et performance - 17 avril 2012

1 of 2

** MEMINFO in pid 1523 [com.example.android.sample] ** Shared Private Heap Heap Heap Pss Dirty Dirty Size Alloc Free ------ ------ ------ ------ ------ ------ Native 3260 944 3220 9960 6359 20 Dalvik 6952 15612 6344 21319 16224 5095 Cursor 0 0 0 Ashmem 0 0 0 Other dev 12583 660 1096 .so mmap 1149 1812 352 .jar mmap 0 0 0 .apk mmap 114 0 0 .ttf mmap 7 0 0 .dex mmap 807 0 0 Other mmap 44 8 28 Unknown 1439 356 1424 TOTAL 26355 19392 12464 31279 22583 5115

Page 56: Android rendu et performance - 17 avril 2012

1 of 2

** MEMINFO in pid 1523 [com.example.android.sample] ** Shared Private Heap Heap Heap Pss Dirty Dirty Size Alloc Free ------ ------ ------ ------ ------ ------ Native 3260 944 3220 9960 6359 20 Dalvik 6952 15612 6344 21319 16224 5095 Cursor 0 0 0 Ashmem 0 0 0 Other dev 12583 660 1096 .so mmap 1149 1812 352 .jar mmap 0 0 0 .apk mmap 114 0 0 .ttf mmap 7 0 0 .dex mmap 807 0 0 Other mmap 44 8 28 Unknown 1439 356 1424 TOTAL 26355 19392 12464 31279 22583 5115

Page 57: Android rendu et performance - 17 avril 2012

1 of 2

** MEMINFO in pid 1523 [com.example.android.sample] ** Shared Private Heap Heap Heap Pss Dirty Dirty Size Alloc Free ------ ------ ------ ------ ------ ------ Native 3260 944 3220 9960 6359 20 Dalvik 6952 15612 6344 21319 16224 5095 Cursor 0 0 0 Ashmem 0 0 0 Other dev 12583 660 1096 .so mmap 1149 1812 352 .jar mmap 0 0 0 .apk mmap 114 0 0 .ttf mmap 7 0 0 .dex mmap 807 0 0 Other mmap 44 8 28 Unknown 1439 356 1424 TOTAL 26355 19392 12464 31279 22583 5115

Page 58: Android rendu et performance - 17 avril 2012

1 of 2

** MEMINFO in pid 1523 [com.example.android.sample] ** Shared Private Heap Heap Heap Pss Dirty Dirty Size Alloc Free ------ ------ ------ ------ ------ ------ Native 3260 944 3220 9960 6359 20 Dalvik 6952 15612 6344 21319 16224 5095 Cursor 0 0 0 Ashmem 0 0 0 Other dev 12583 660 1096 .so mmap 1149 1812 352 .jar mmap 0 0 0 .apk mmap 114 0 0 .ttf mmap 7 0 0 .dex mmap 807 0 0 Other mmap 44 8 28 Unknown 1439 356 1424 TOTAL 26355 19392 12464 31279 22583 5115

Page 59: Android rendu et performance - 17 avril 2012

2 of 2

Objects Views: 45 ViewRootImpl: 1 AppContexts: 2 Activities: 1 Assets: 2 AssetManagers: 2 Local Binders: 13 Proxy Binders: 14 Death Recipients: 0 OpenSSL Sockets: 0 SQL heap: 0 MEMORY_USED: 0 PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 0 Asset Allocations zip:/data/app/com.example.android.sample-2.apk:/resources.arsc: 2K

Page 60: Android rendu et performance - 17 avril 2012

2 of 2

Objects Views: 45 ViewRootImpl: 1 AppContexts: 2 Activities: 1 Assets: 2 AssetManagers: 2 Local Binders: 13 Proxy Binders: 14 Death Recipients: 0 OpenSSL Sockets: 0 SQL heap: 0 MEMORY_USED: 0 PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 0 Asset Allocations zip:/data/app/com.example.android.sample-2.apk:/resources.arsc: 2K

Page 61: Android rendu et performance - 17 avril 2012

2 of 2

Objects Views: 45 ViewRootImpl: 1 AppContexts: 2 Activities: 1 Assets: 2 AssetManagers: 2 Local Binders: 13 Proxy Binders: 14 Death Recipients: 0 OpenSSL Sockets: 0 SQL heap: 0 MEMORY_USED: 0 PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 0 Asset Allocations zip:/data/app/com.example.android.sample-2.apk:/resources.arsc: 2K

Page 62: Android rendu et performance - 17 avril 2012

$ adb shell dumpsys gfxinfo <process>

Page 63: Android rendu et performance - 17 avril 2012

Caches:Current memory usage / total memory usage (bytes): TextureCache 1166964 / 25165824 LayerCache 0 / 16777216 GradientCache 0 / 524288 PathCache 0 / 4194304 CircleShapeCache 0 / 1048576 OvalShapeCache 0 / 1048576 RoundRectShapeCache 0 / 1048576 RectShapeCache 0 / 1048576 ArcShapeCache 0 / 1048576 TextDropShadowCache 0 / 2097152 FontRenderer 0 262144 / 262144 FontRenderer 1 262144 / 262144 FontRenderer 2 262144 / 262144Other: FboCache 1 / 16 PatchCache 22 / 512Total memory usage: 1953396 bytes, 1.86 MB

View hierarchy: android.view.ViewRootImpl@40b82f70: 45 views, 4.97 kB (display lists)

Total ViewRootImpl: 1Total Views: 45Total DisplayList: 4.97 kB

Page 64: Android rendu et performance - 17 avril 2012

Caches:Current memory usage / total memory usage (bytes): TextureCache 1166964 / 25165824 LayerCache 0 / 16777216 GradientCache 0 / 524288 PathCache 0 / 4194304 CircleShapeCache 0 / 1048576 OvalShapeCache 0 / 1048576 RoundRectShapeCache 0 / 1048576 RectShapeCache 0 / 1048576 ArcShapeCache 0 / 1048576 TextDropShadowCache 0 / 2097152 FontRenderer 0 262144 / 262144 FontRenderer 1 262144 / 262144 FontRenderer 2 262144 / 262144Other: FboCache 1 / 16 PatchCache 22 / 512Total memory usage: 1953396 bytes, 1.86 MB

View hierarchy: android.view.ViewRootImpl@40b82f70: 45 views, 4.97 kB (display lists)

Total ViewRootImpl: 1Total Views: 45Total DisplayList: 4.97 kB

Page 65: Android rendu et performance - 17 avril 2012

Caches:Current memory usage / total memory usage (bytes): TextureCache 1166964 / 25165824 LayerCache 0 / 16777216 GradientCache 0 / 524288 PathCache 0 / 4194304 CircleShapeCache 0 / 1048576 OvalShapeCache 0 / 1048576 RoundRectShapeCache 0 / 1048576 RectShapeCache 0 / 1048576 ArcShapeCache 0 / 1048576 TextDropShadowCache 0 / 2097152 FontRenderer 0 262144 / 262144 FontRenderer 1 262144 / 262144 FontRenderer 2 262144 / 262144Other: FboCache 1 / 16 PatchCache 22 / 512Total memory usage: 1953396 bytes, 1.86 MB

View hierarchy: android.view.ViewRootImpl@40b82f70: 45 views, 4.97 kB (display lists)

Total ViewRootImpl: 1Total Views: 45Total DisplayList: 4.97 kB

Page 66: Android rendu et performance - 17 avril 2012

Rendu accéléré

• Certains opérations sont gratuites• Certains opérations sont peu coûteuses• Certains opérations sont très coûteuses

Page 67: Android rendu et performance - 17 avril 2012

Très coûteux

• View.setAlpha() ou Canvas.saveLayer()– Crée un buffer temporaire

– Coûte du temps

– Coûte de la mémoire

Page 68: Android rendu et performance - 17 avril 2012

Gratuit

• View.setAlpha()– Avec un layer

– LAYER_TYPE_SOFTWARE

– LAYER_TYPE_HARDWARE

Page 69: Android rendu et performance - 17 avril 2012

Très coûteux

• Créer un layer– Allocation mémoire

– Rendu, surtout layers software

• Faites-le en avance– View.buildLayer()

• Évitez les invalidate()– Rafraîchit le layer

Page 70: Android rendu et performance - 17 avril 2012

Peu coûteux

• Un layer se dessine VITE• Effets visuels presque gratuits

– Fondu (opacité avec alpha)

– Filtres de couleurs

Page 71: Android rendu et performance - 17 avril 2012

Coûteux

• Modifier une Paint souvent

• Modifier un Bitmap souvent

• Modifier un Path souvent

• Créer un nouvel objet encore plus coûteux

Page 72: Android rendu et performance - 17 avril 2012

Gratuit

• Transformations– Translation

– Rotation 2D et 3D

– Mise à l’échelle

• Filtrage de texture– Paint.setFilterBitmap(true)

• Avec ou sans layer

Page 73: Android rendu et performance - 17 avril 2012

Optimiser pour le GPU

• Redessiner seulement les parties utiles– N’utiliez pas View.invalidate()

– Utilisez View.invalidate(l, t, r, b)

• Permet de traverser l’arbre de la UI rapidement

Page 74: Android rendu et performance - 17 avril 2012

Optimiser pour le GPU

• Groupez les primitives– Pas bien : boucle de Canvas.drawLine()

– Bien : Canvas.drawLines()

• Évitez les changements d’état– Minimisez les appels à save() & restore()

Page 75: Android rendu et performance - 17 avril 2012

Optimiser pour le GPU

• Groupez les commandes dans cet ordre– Par type

– Par Paint

– Par Bitmap

Page 76: Android rendu et performance - 17 avril 2012

1: c.drawText(...); 2: c.drawBitmap(...); 3: c.drawLine(...); 4: c.drawText(...); 5: c.drawBitmap(...); 6: c.drawLine(...); 7: c.drawText(...); 8: c.drawBitmap(...); 9: c.drawLine(...);

Pas bien

Page 77: Android rendu et performance - 17 avril 2012

1: c.drawText(...); 2: c.drawBitmap(...); 3: c.drawLine(...); 4: c.drawText(...); 5: c.drawBitmap(...); 6: c.drawLine(...); 7: c.drawText(...); 8: c.drawBitmap(...); 9: c.drawLine(...);

Pas bien

Page 78: Android rendu et performance - 17 avril 2012

1: c.drawText(...); 2: c.drawText(...); 3: c.drawText(...); 4: c.drawBitmap(...); 5: c.drawBitmap(...); 6: c.drawBitmap(...); 7: c.drawLine(...); 8: c.drawLine(...); 9: c.drawLine(...);

Bien

Page 79: Android rendu et performance - 17 avril 2012

1: c.drawText(...); 2: c.drawText(...); 3: c.drawText(...); 4: c.drawBitmap(...); 5: c.drawBitmap(...); 6: c.drawBitmap(...); 7: c.drawLines(...);

Mieux

Page 80: Android rendu et performance - 17 avril 2012

Pour plus d’informations

• Google I|O 2011– Android Accelerated Rendering

– http://youtu.be/v9S5EO7CLjo

• Parleys.com– Various Devoxx talks for the past 4 years

• Android Developers– http://d.android.com

Page 81: Android rendu et performance - 17 avril 2012
Page 82: Android rendu et performance - 17 avril 2012

Questions et (peut-être) réponses