En bref : parce que la SurfaceView ne subit pas le multithreading de la View
Now the long story unshortened :
Lorsqu'une vue doit etre mise a jour sous android, cette mise a jour est interruptible par un appel téléphonique, par une notification, par une synchronisation de compte, par le démontage logiciel de la carte SD pour se connecter au PC en mode USB Storage etc ...
Cette mise à jour est donc optimisée pour l'utilisateur et pas pour la vitesse. Toujours en édulcorant elle se compose de multiples "Déverouillage de la memoire video + mise a jour de la petite partie nécessaire + reverouillage de la memoire video".
Imaginez un flux RSS qui se met à jour :
Cas 1: Le flux rss est recu rapidement, son titre et tous ses articles sont recus instantanement
- Le label "Titre" se mettra a jour rapidement
- Chaque element de la liste de news se mettra a jour rapidement
Cas 2: Le flux rss est recu presque rapidement, la 1ere moitié en 100ms puis une attente, puis la deuxieme moitie
- Le label "Titre" se mettra a jour rapidement
- Les articles de la 1ere moitie de la liste sont ajoutés, ils doivent être affichés/redessinés à l'écran
- Puis les articles de la deuxième moitié apparaissent
Cas 3: Le réseau est lent est le flux est chargé à la vitesse de l'escargot rhumatisant
- Vous aurez le temps de voir se rafraichir/apparaitre chaque article
Transposez cela a l' "algorithme d'affichage" :
Une vue est par définition lente
- A chaque fois qu'elle doit se mettre à jour
- Elle se demande si c'est bien le bon moment
- Si oui elle essaie de limiter la zone a mettre à jour
- Puis enfin elle se met à jour en bloquant le moins possible la memoire video (pour ne pas empecher quelque affichage de plus haute importance d'arriver, par exempl les notifications)
- On appelle ce blocage un créneau Lock
Maintenant prenons le cas de la SurfaceView :
Meme si elle hérite de View, elle ne suit pas le même contrat au sein du noyau Android :
Entre le moment ou lockCanvas() arrive et jusqu'a ce que unlockCanvas() arrive, personne ne peut toucher à cette partie de l'écran (ni notification, ni appel, ni tout-ce-que-l-os-sai-faire-en-parrallele. Comme le fait FlashPlayer sur les navigateurs, impossible de dessiner par dessus, c'est "avalé" par le flash qui "possède" sa zone 'écran).
Bref, pas d'interruption pendant que vous utilisez SurfaceView, donc une vitesse de jeu beaucoup plus rapide.
En espérant vous avoir éclairé .. et parlé en langage compréhensible
Partager