C'est loin de la question initiale posée date mais je voulais donner mon propre compréhension dans le cas où ça pourrait aider quelqu'un d'autre. Si je suis dans l'erreur s'il vous plaît laissez-moi savoir =)
Pensez à la façon d'un moniteur fonctionne:
Il est mis à jour 60Hz -- 60 fois par seconde. Le scintillement de scintillement de scintillement de 60 fois, mais vos yeux sont lents et ne peut pas vraiment le dire. Le moniteur montre tout ce qui est dans le tampon de sortie, il vient de se traîne ces données à des intervalles de 1/60ème de seconde, peu importe ce que vous faites.
Maintenant, pourquoi voudriez-vous votre programme de mise à jour de l'ensemble de la mémoire tampon de 60 fois par seconde si l'image ne devrait pas changer souvent? Que faire si vous modifiez uniquement un pixel de l'image, si vous réécrire la totalité de la mémoire tampon?
C'est une abstraction de l'idée de base: vous souhaitez changer le tampon de sortie basé sur les informations que vous souhaitez afficher sur l'écran. Vous voulez économiser autant de temps processeur et de la mémoire tampon d'écriture de temps que possible, afin de ne pas modifier des parties de la mémoire tampon qui n'a pas besoin d'être changé pour le prochain écran de traction.
Le moniteur est séparé de votre ordinateur et de la logique (les programmes), il lit à partir de la mémoire tampon de sortie quel que soit le taux de la mise à jour de l'écran. Nous voulons que notre ordinateur pour arrêter la synchronisation et le retraçage inutilement. Nous pouvons résoudre ce problème en changeant la façon dont nous travailler avec la mémoire tampon, ce qui peut être fait dans une variété de façons. Sa technique met en œuvre une file d'attente FIFO qui est en retard -- il tient de ce que nous venons d'envoyer à la mémoire tampon. Le retard de la file d'attente FIFO ne détient pas de données de pixels, il détient des "formes primitives" (qui pourrait être pixels dans votre application, mais peuvent également être des lignes, des rectangles, facile à dessiner des choses parce qu'ils sont seulement des formes, pas de superflu de données est autorisé).
Si vous voulez dessiner/effacer les choses à partir de l'écran? Pas de problème. Sur la base du contenu de la file d'attente FIFO je sais ce que le moniteur ressemble à l'instant. Je compare ma sortie désirée (pour les effacer ou d'en tirer de nouvelles primitives) avec la file d'attente FIFO et de ne modifier que les valeurs qui doivent être modifiés ou mis à jour. C'est l'étape qui donne le nom de Différentiel de l'Évaluation.
Deux manières distinctes dont j'apprécie ce:
La Première:
Mike Dunlavey utilise un conditionnel-déclaration d'extension. La file d'attente FIFO contient beaucoup de renseignements ("état antérieur" ou les trucs sur le moniteur ou le temps de vote sur l'appareil). Tout ce que vous avez à ajouter à cet état est l'état que vous souhaitez voir apparaître sur l'écran suivant.
Conditionnelle d'un bit est ajouté à toutes les machines à sous qui peut contenir une primitive dans la file d'attente FIFO.
0 means erase
1 means draw
Cependant, nous avons:
Was 0, now 0: don't do anything;
Was 0, now 1: add it to the buffer (draw it);
Was 1, now 1: don't do anything;
Was 1, now 0: erase it from the buffer (erase it from the screen);
C'est élégant, parce que lorsque vous mettez à jour quelque chose vous avez vraiment besoin de savoir ce que les primitives que vous voulez dessiner à l'écran-cette comparaison permettra de savoir si il doit effacer une primitive ou ajouter/garder/dans la mémoire tampon.
La Deuxième:
Ce n'est qu'un exemple et je pense que ce que Mike est vraiment arriver à une chose qui devrait être fondamental dans la conception de tous les projets: Réduire l' (de calcul) la complexité de la conception par la rédaction de votre la plupart de calcul des opérations intenses comme computerbrain-alimentaire ou aussi près que vous pouvez obtenir. La synchronisation des appareils.
Un redessiner méthode pour dessiner la totalité de l'écran est incroyablement coûteux, et il y a d'autres applications où ce regard est très important.
Nous ne sommes jamais à "déplacer" les objets autour de l'écran. "Déménagement" est cher, si nous voulons imiter l'action physique de "déplacement" lors de la conception de code pour quelque chose comme un moniteur d'ordinateur. Au lieu de cela, les objets fondamentalement juste scintillement sur et en dehors avec le moniteur. Chaque fois qu'un objet se déplace, c'est désormais un nouvel ensemble de primitives et de l'ancien ensemble de primitives scintille off.
Chaque fois que le moniteur tire de la mémoire tampon nous avons des entrées qui ressemblent à des
Draw bit primitive_description
0 Rect(0,0,5,5);
1 Circ(0,0,2);
1 Line(0,1,2,5);
Ne fait jamais l'objet d'interagir avec l'écran (ou sensibles au temps d'interrogation de l'appareil), nous pouvons gérer plus intelligemment qu'un objet quand il est avec gourmandise vous demande de mettre à jour la totalité de l'écran juste pour montrer un changement propre à lui-même.
Disons que nous avons une liste de toutes les primitives graphiques de notre programme est capable de générer et qui nous attacher chaque primitive à un ensemble d'instructions conditionnelles
if (iWantGreenCircle && iWantBigCircle && iWantOutlineOnMyCircle) ...
Bien sûr, c'est une abstraction et, vraiment, l'ensemble des conditions qui représente un primitif être on/off pourrait être grande (peut-être des centaines de drapeaux qui doivent tous avoir la valeur true).
Si nous exécutons le programme, on peut tracer à l'écran de façon à peu près à la même vitesse à laquelle nous pouvons évaluer l'ensemble de ces conditions. (Dans le pire des cas: combien de temps il faut pour évaluer le plus grand ensemble d'instructions conditionnelles)
Maintenant, pour n'importe quel état dans le programme, il suffit d'évaluer toutes les conditions et la sortie à l'écran ultra-rapide! (Nous savons que notre forme de primitives et de leurs personnes à charge s'-états)
Ce serait comme acheter un graphique intense de jeu seulement, au lieu de l'installer sur votre disque dur et en l'exécutant par le biais de votre processeur, vous achetez une marque-nouveau conseil d'administration qui détient la totalité du jeu et prend comme données d'entrée: souris, clavier, et prend en sortie: moniteur. Incroyablement condensé conditionnelle d'évaluation (comme la forme la plus fondamentale d'une condition est portes logiques sur des cartes de circuits imprimés). Ce serait, naturellement, être très réactif mais n'offre presque pas de soutien dans la résolution de bugs, comme l'ensemble du conseil d'administration les modifications de conception lorsque vous faites un petit changement de conception (parce que le "design" est tellement éloigné de la nature de la carte de circuit). Au détriment de la souplesse et de clarté dans la façon de représenter les données à l'interne, nous avons acquis une "réactivité" parce que nous sommes de ne plus faire de "pensée" dans l'ordinateur, c'est tout juste le réflexe de la carte de circuit sur la base des contributions.
La leçon, ce que je comprends, c'est de diviser le travail tel que de donner à chaque partie du système (pas seulement sur l'ordinateur et le moniteur) quelque chose qu'il peut faire. Le terme "ordinateur " pensée" qui peut être fait en termes de concepts comme des objets... l'ordinateur du cerveau fera un plaisir de l'essayer et de penser à tout cela pour vous, mais vous pouvez simplifier la tâche une bonne affaire si vous êtes en mesure de permettre à l'ordinateur de penser en termes de data_update et conditional_evals. Notre homme l'abstraction des concepts dans le code sont idéaliste, et dans le cas du programme interne de dessiner des méthodes un peu trop idéaliste. Quand tout ce que vous voulez, c'est un résultat (tableau de pixels avec la couleur correcte des valeurs) et vous avez une machine qui peut facilement cracher un tableau que big toutes les 1/60ème de seconde, essayer d'éliminer le plus fleuri de la pensée à partir de l'ordinateur du cerveau que possible de sorte que vous pouvez vous concentrer sur ce que vous voulez vraiment: pour synchroniser votre graphique des mises à jour avec votre (rapide) entrées et le comportement naturel de l'écran.
Comment fonctionne cette carte pour d'autres applications?
J'aimerais entendre d'autres exemples, mais je suis sûr qu'il ya beaucoup. Je pense que tout ce qui fournit en temps réel une "fenêtre" dans l'état de vos informations (variable d'état ou de quelque chose comme une base de données... un moniteur est juste une fenêtre dans votre mémoire tampon d'affichage) peuvent bénéficier de ces points de vue.