lundi 22 janvier 2018

Chapitre 16 : créer une figure animée en utilisant le frameBuffer : 4



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