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 :
Formation des images en 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 :
Formation des images en 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.

 

Retour au Chapitre XIV


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