Niveaux de gris :
Fonctionnement
Cette page, un peu à part par rapport au reste du
tutorial, va nous permettre de voir comment les niveaux de gris sont mis en
fonctionnement sur nos TIs.
Comme vous avez sans doute déjà pu le remarquer, le TIOS
n'utilise que des graphismes en noir et blanc... cela montre bien que,
normalement, l'utilisation des niveaux de gris n'est pas possible...
C'est pour cela que des "feintes" ont été mises
en place, et nous permettent maintenant de programmer en niveaux de gris sous
TIGCC.
Vous avez peut-être remarqué que, sur HW1, les niveaux
de gris sont corrects, alors qu'ils ont souvent tendance à clignoter sur HW2...
cela est du au fait que les graphismes ne sont pas gérés de la même façon
sur ces deux types de machines.
Quoique... Maintenant, les niveaux de gris se sont
considérablement améliorés sur HW2, depuis la sortie de TIGCC 0.91 pour le
mode nostub, et d'UniversalOS1.21 pour le mode Kernel.
Nous verrons donc, dans cette page, comment fonctionnent les niveaux de gris sur HW1, puis sur HW2.
I:\ Les niveaux de gris sur HW1 :
Nos TIs disposent d'un contrôleur, qui est capable
d'afficher des images en noir et blanc (ce que fait le TIOS dès que la
calculatrice est allumée !). Les images affichées sur l'écran sont
mémorisées dans une partie de la RAM de la TI, sous forme de bits : chaque bit
correspond à un pixels de l'écran. (On peut assimiler ce mode de stockage à
la technique manuelle de codage des sprites, étudiée au Chapitre
XII). De la même façon que pour les sprites, si le bit est armé, le pixel
est allumé (il sera alors noir), et si le bit ne l'est pas, le pixel sera
éteint (il sera alors blanc).
Le TIOS utilise toujours la même partie de la RAM pour
stocker les informations correspondant à l'image à afficher, mais ,
heureusement, TIGCC nous permet de reprogrammer cet emplacement, et même d'en
utiliser plusieurs alternativement, ce qui est, comme nous le verrons bientôt,
à la base de l'utilisation des niveaux de gris.
Pour pouvoir utiliser des niveaux de gris, il faut que que nous utilisions deux emplacements différents dans la RAM. (Ces emplacements sont nommés Plane dans TIGCC ; nous les appellerons donc à présent Plane1 et Plane2...).
Avec ces deux Planes, nous pouvons construire deux niveaux de gris différents :
Mais, ici, on ne vois que deux niveaux de gris... C'est normal : les deux autres sont :
Donc, pour afficher des niveaux de gris, il faudrait
arriver à afficher les deux plans à la fois... Malheureusement, ceci n'est pas
possible !!!
Il va donc falloir utiliser une autre technique, basée sur
la vitesse de réaction de l'œil humain... pour vous permettre de comprendre ma
pensée, je vais prendre l'exemple du cinéma : vous savez sans doute qu'au
cinéma, un film n'est rien de plus qu'une suite d'images, projetées à la
vitesse de 24 images par seconde, ce qui est suffisant pour "feinter"
l'œil humain, qui n'est capable de percevoir distinctement "que" 10
images par seconde.
Eh bien, c'est la même technique qui est utilisée sur nos
TIs : les deux plans sont affiché en noir et blanc alternativement (à partir
de l'utilisation de Timers, basés sur des Interrupts), et on a l'impression de
voir les deux à la fois...
Mais, me direz vous, si on affiche alternativement deux
images en noir et blanc, le résultat devrait aussi être en noir et blanc !
Pour éviter ceci, les plan correspondant au gris foncé est affiché deux fois
plus longtemps que celui correspondant au gris clair. Ainsi, si on prend une
unité arbitraire de 3, on aura l'affichage suivant :
Le plan DARK_GRAY est donc affiché pendant environ 66% du temps, alors que le plan LIGHT_GRAY est affiché pendant environ 33% du temps.
Sur HW1, cette technique permet d'obtenir des graphismes en niveaux de gris qui ne clignotent pas (ou très peu), car, pour chaque changement de plan actif, il suffit de modifier l'adresse du plan actif, et cette manipulation peut se faire très rapidement.
Voici comment se forment les niveaux de gris sur HW1 :

Excusez-moi pour la qualité du dessin, mais je suis pas fort en
graphismes !!!
II:\ Les niveaux de gris sur HW2 :
Avant de vous attaquer à cette partie, je vous conseille très fortement de lire celle qui est consacrée aux niveaux de gris sur HW1, car les bases des niveaux de gris y sont expliquées, et je penses que vous arriverez mieux à comprendre les problèmes que posent le HW2 si vous savez comment fonctionnent le HW1...
Sur HW2, la situation est totalement différente de celle
sur HW1. En effet, les TIs HW2 sont dotés d'un contrôleur supplémentaire pour
l'affichage des graphismes, équipé de sa propre RAM intégrée... Celle-ci ne
permet de conserver que une seule image... Il faut donc continuellement charger
cette RAM intégrée, l'afficher, la vider, et la recharger ave l'autre plan.
Étant donnée que cette RAM intégrée au contrôleur fait
3840octets, cela représente, pour un affichage en niveaux de gris quelques
7680octets pour une image...
Ainsi, pour afficher une image avec une fréquence de
rafraîchissement de 15 fois par seconde, cela représente 115200octets à faire
passer chaque seconde de la RAM de la TI à la RAM du contrôleur !!! Une telle
quantité de donnée ne peut pas transiter en si peu de temps, ce qui explique
pourquoi les graphismes en niveaux de gris clignotent autant sur HW2 !!!
(Je ne sais pas comment fonctionne la nouvelle méthode qui
permet d'obtenir des Grays quasiment parfait sur HW2...)
Voici comment se forment les niveaux de gris sur HW2 :

Excusez-moi pour la qualité du dessin, mais je suis pas fort en
graphismes !!!
III:\ Résoudre les problèmes que pose le HW2 :
Diverses techniques existent pour améliorer l'affichage des niveaux de gris sur HW2.
La plus connue est celle du double-buffering, qui consiste
à créer une image en mémoire virtuelle pendant qu'une autre est affichée à
l'écran. Cela évite d'avoir à tracer l'image à l'écran en même temps qu'on
la "calcule" : les images affichés sont déjà
"calculées", ce qui permet de réduire le temps nécessaire à leur
affichage, et donc réduit les clignotements.
Malheureusement, le double-buffering n'est pas utilisé
directement par TIGCC... Donc, la plupart des programmes utilisant cette
technique le font de part eux-même.
Je ne peux malheureusement pas vous en dire plus sur cette technique, car je ne l'ai encore moi-même jamais mise en pratique...
Depuis la version 1.21 de UniversalOS, les programmes
utilisant des niveaux de gris en mode Kernel ne présentent quasiment plus de
clignotements sur HW2, grâce à une technique déterminée par l'auteur de ce
Kernel. (Julien Muchembled).
De même, depuis la version 0.9 ou 0.91 de TIGCC, les
programmes en niveaux de gris en mode nostub ne clignotent quasiment plus eux
aussi, grâce à la nouvelle gestion de ceux-ci.
Copyright Squale92 & Verstand. Logo et sigle TCI® réservés. Développé pour MS Internet Explorer 5.0 en 1024x768 pixels. Page modifiée le