Dans ce programme, j’ai essayé d’effectuer une animation
simple pour voir les difficultés que nous pouvions rencontrer. Et en effet je
ne suis pas très satisfait du résultat car en utilisant une zone mémoire pour
dessiner et non pas la zone directement accessible du périphérique écran,
l’animation est très irrégulière. En effet la recopie de la zone mémoire vers
le périphérique ne s’effectue que toutes les 0,5 secondes à ce qu’il me semble.
Mais je vous donne quand même l’exemple du programme qui
consiste à faire tourner un rayon d’un cercle autour du centre. Le programme
reprend le même début que les programmes précédents et nous adaptons seulement
la procédure dessin. Nous commençons par peindre tout le fond de l’écran avec
la routine coloriageFond puis nous allons calculer tous les points de la
circonférence du cercle qui servira de base à la rotation. Pour cela nous
adaptons la procèdure de dessin d’un cercle vu dans le programme précédent. En
fait au lien de dessiner chaque pixel de cette circonférence, nous enregistrons
la position x et y dans une table en mémoire. C’est un peu compliqué car comme
nous l’avons vu, le calcul est fait pour un octant puis dupliqué pour les
autres octants en changeant les signes ou les valeurs des positions x et y. Il
a donc fallu retrouver l’ordre des 8 octants pour que les points enregistrés
soient bien dans l’ordre c'est à dire dans le sens horaire de rotation. Pour vérifier l’exactitude des calculs, nous
affichons le cercle complet par la routine balayageCercle.
Puis le programme fait appel à la routine rotationRayon qui
va tracer une ligne droite entre le centre du cercle et chaque point de la
circonférence. Pour animer l’image, nous dessinons le rayon en rouge puis après
un temps d’attente, nous redessinons le rayon avec la couleur du fond ce qui
conduit à son effacement.Remarque: le cercle de contrôle précédemment tracé s'effacera en fonction de la rotation du rayon.
Pour l’attente, j’avais dans un premier temps programmé une
boucle qui décrementait un registre mais cela entrainait une consommation de
100% du processeur. Et donc dans un deuxième temps, j’ai utilisé une fonction
du noyau linux sys_nanosleep code 0x92
qui permet de gérer un temps d’attente. J’ai aussi ajouté un appel à une
fonction de synchronisation code 0x90 de la portion mémoire mappée avec le périphérique pour essayer d’améliorer
l’animation. (Attention, pour des temps en secondes il faut alimenter la
première zone mémoire de 4 octets des zones passées en paramètre et pour des
temps en nanosecondes, il faut alimenter la deuxième zone).
Pour des temps d’attente supérieur à 0,5 seconde (500 000
000 nano secondes), l’animation est correcte mais lente. Pour des temps
inférieurs, sur mon système, l’animation est saccadée et saute d’une position à l’autre.
Donc c’est pas terrible pour effectuer des animations
rapides et il faudra donc trouver des solutions autres que le FrameBuffer.
Aucun commentaire:
Enregistrer un commentaire