Vés al contingut

Buffer múltiple

De la Viquipèdia, l'enciclopèdia lliure
Els conjunts 1, 2 i 3 representen l'operació de simple, doble i triple buffering, respectivament, amb sincronització vertical (vsync) activada. A cada gràfic, el temps flueix d'esquerra a dreta. El conjunt 4 mostra el que passa quan un frame (B, en aquest cas) pren més temps del normal per dibuixar. En aquest cas, una actualització del marc es perd. En implementacions sensibles al temps, com ara la reproducció de vídeo, es pot eliminar tot el marc. Amb triple buffering està en conjunt 5, dibuixant el marc B pot començar sense haver d'esperar un marc que es copiarà a la memòria de vídeo, reduint la possibilitat de la falta d'un marc de retard a la seva tornada vertical.

En informàtica, un buffer múltiple és l'ús de més d'un buffer per a l'emmagatzematge d'un bloc de dades. Si aquestes dades es llegeixen i s'escriuen al mateix temps, un buffer múltiple permet al "lector" obtenir una visió completa de les dades (encara que no estigui actualitzada), en comptes de tenir una versió parcialment actualitzada de les dades que crea l'"escriptor". També es fan servir per evitar la necessitat d'usar RAM de doble port quan els lectors i escriptors són diferents dispositius.

Descripció

[modifica]

La manera més fàcil d'explicar com funciona un buffer múltiple és utilitzant un exemple del món real:

És un dia assolellat i decideixes omplir la piscina del jardí, però no trobes la mànega, així que l'has d'omplir amb galledes d'aigua. Per tant, omples una galleda d'aigua (o buffer) de l'aixeta (o font), tanques l'aixeta, portes la galleda fins a la piscina, tires l'aigua a dins i tornes a l'aixeta per repetir el procés. Això és anàleg a l'ús d'un buffer únic. L'aixeta ha d'estar tancada mentre tu "processes" la galleda d'aigua.

Ara, pensa com ho faries si tinguessis dues galledes. Podries omplir la primera galleda i canviar la segona mentre l'aixeta està oberta, de manera que tens el període que trigui a omplir-se per buidar la primera galleda a la piscina. Quan tornis, pots canviar les galledes de nou, de manera que es torni a omplir la primera mentre buides la segona a la piscina. Això pot repetir-se fins que la piscina estigui plena.

És fàcil veure que aquesta tècnica omplirà la piscina molt més ràpidament que quan s'espera mentre s'omplen les galledes. Això és anàleg al buffer doble. La font pot estar funcionant tota l'estona, però no és necessari esperar-se mentre s'executa el procés.

Si es fa servir una altra persona per portar galledes a la piscina mentre una està omplint-se i una altra buidant-se, això seria anàleg al buffer triple. Si aquest pas dura prou, podrien utilitzar-se més galledes, de manera que l'aixeta estaria contínuament omplint galledes.

En informàtica, la situació de tenir una font que no pot o no ha de ser tancada és comuna (com en un streaming d'àudio). A més, els ordinadors prefereixen treballar amb porcions de dades abans que amb corrents (streams). En aquestes situacions solen utilitzar-se els buffers dobles.

Variabilitat

[modifica]

Doble buffer

[modifica]

Xarxa de Petri

[modifica]
Xarxa de Petri del buffer doble

La xarxa de Petri de la il·lustració mostra com treballa un doble buffer:

Les transicions W1 i W2 representen l'escriptura dels buffers 1 i 2 respectivament, mentre R1 i R2 representen la lectura dels buffers 1 i 2 respectivament.

Al principi només la transició W1 està activada. Quan W1 acaba, tant R1 com R2 estan actives, motiu pel qual poden procedir en paral·lel. Quan acaben, R2 i W1 procedeixen també en paral·lel i així successivament.

Després de la transició inicial (en la qual només W1 s'inicia) el sistema és periòdic i les transicions s'activen sempre per parells (R1 amb W2 i R2 amb W1 respectivament).

Aquesta xarxa de Petri és viva i segura.

En gràfics per ordinador

[modifica]

En gràfics de computadora, el doble buffer és una tècnica per a la presentació de gràfics en temps real que elimina o redueix considerablement el nombre de parpellejos, soroll o altres artefactes.

És difícil que un programa refresqui la imatge en una pantalla sense que els píxels canviïn més d'una vegada. Per exemple, per actualitzar una pàgina de text és molt més fàcil esborrar tota la pàgina i, a continuació, dibuixar les lletres de nou, que esborrar tots els píxels que estan presents en la nova imatge. No obstant això, aquesta imatge intermèdia (quan s'esborren tots els píxels) és percebuda per l'usuari com un parpelleig. Els monitors d'ordinador constantment redibuixen la seva imatge visible (entorn de 60 vegades per segon), per la qual cosa fins i tot una actualització perfecta pot ser visible momentàniament com un divisor horitzontal entre la "nova" imatge i la "vella" (efecte conegut com a llagrimeig).

Una aplicació de programari d'emmagatzematge en buffer doble té totes les operacions de dibuix, emmagatzema els seus resultats en alguna regió de la memòria RAM del sistema, qualsevol regió, i sovint es denomina "buffer de reserva". Quan totes les operacions de dibuix es consideren completades, tota la regió (o només la part modificada) es copia en la memòria RAM de vídeo (el "buffer frontal"), la qual cosa sol ser la còpia sincronitzada amb la biga de la trama del monitor amb la finalitat d'evitar que es trenqui. El doble buffering necessàriament requereix més memòria de vídeo i el temps de CPU que el buffer, solament per la memòria de vídeo assignada pel buffer de reserva, el temps per a l'operació de còpia, i el temps d'espera per a la sincronització.

Els gestors de finestres de composició sovint combinen la "còpia" de l'operació de "composició", utilitzada per a la posició de les finestres, els transformen amb efectes d'escala o deformacions i fan parts transparents. Així, el "buffer front" només pot contenir la imatge composta vista en pantalla, mentre que hi ha un altre "buffer de reserva" per a cada finestra que conté la imatge no composta del contingut de la finestra sencera.

Triple buffer

[modifica]

En gràfics de computadora, el triple buffering és similar al doble buffer, però proporciona una millora de la velocitat. En el doble buffer, el programa ha d'esperar fins que el dibuix acabat es copia o es canvia abans de començar el proper canvi. Aquest període d'espera podria ser de diversos mil·lisegons i mentre dura no es pot tocar el buffer.

En triple buffering el programa compta amb dos amortidors nous i immediatament pot començar a dibuixar el que no participa en aquesta còpia. El buffer en tercer lloc, el buffer frontal, és llegit per la targeta gràfica per mostrar la imatge en el monitor. Una vegada que el monitor ha estat actualitzat, el buffer frontal es volteja amb el buffer de reserva (o copiat d'aquest buffer de reserva). Atès que un dels topalls de tornada sempre està complet, la targeta gràfica no ha d'esperar perquè el programari estigui complet. En conseqüència, el programari i la targeta gràfica són completament independents, i es pot executar al seu propi ritme. Finalment, la imatge mostrada s'inicia sense esperar la sincronització i, per tant, amb un desfasament mínim. [1]

A causa que l'algorisme de programari no ha de sondejar el maquinari de gràfics per controlar els esdeveniments d'actualització, l'algorisme és lliure de córrer tan ràpid com sigui possible. Això pot significar que diversos dibuixos que mai es mostren són per escrit als topalls de tornada. Aquest no és l'únic mètode de triple buffer disponible, però és el més freqüent en l'arquitectura de la PC, on la velocitat de la màquina de destinació és molt variable.

Un altre mètode de triple buffering implica la sincronització amb la velocitat de fotogrames del monitor. El dibuix no es fa si els dos amortidors posteriors contenen imatges acabades que no s'han mostrat encara. Això evita la pèrdua de la CPU dibuixant imatges Undisplayed i també dona lloc a una velocitat més constant (suau moviment d'objectes en moviment), però amb augment de la latència. [2] Aquest és el cas quan es fa servir triple buffer en DirectX, on hi ha una cadena de tres buffers que són prestats i que apareixen sempre.

El buffer triple implica tres topalls, però el mètode pot estendre's a molts com a amortidors que resulti pràctic per a l'aplicació. En general, no hi ha cap avantatge d'usar més de tres topalls.

Quàdruple buffer

[modifica]

El terme buffering quàdruple es fa servir en les implementacions d'estereoscòpic, i significa l'ús de doble buffer per a cadascuna de les imatges de l'ull esquerre i dret. Per tant, hi ha quatre topalls totals. El comandament per intercanviar o copiar el buffer normalment s'aplica als dos parells alhora. Si es fa servir triple buffering, llavors seria de sis topalls.

Voltejar la pàgina

[modifica]

En aquest mètode (de vegades anomenat el buffer de ping-pong), en comptes de copiar les dades, els amortidors són capaços de ser mostrats (tots dos estan en VRAM). En un moment donat, un buffer es pot mostrar en el monitor, mentre l'altre buffer s'està elaborant. Quan el dibuix està complet, les funcions dels dos es connecten. La pàgina-flip s'aconsegueix normalment mitjançant la modificació del valor d'un punter al començament de la visualització de dades en la memòria de vídeo.

La pàgina-flip és molt més ràpida que copiar les dades i pot garantir que la ruptura no es veurà, sempre que les pàgines es canviïn durant el període vertical en blanc del monitor, quan no hi ha dades de vídeo o s'estan elaborant. El buffer actiu i visible es diu buffer frontal, mentre que la pàgina de fons s'anomena buffer de reserva.

Altres usos

[modifica]

El buffer doble es fa servir per copiar dades entre dos topalls per l'accés directe a memòria (Direct Memory Access, DMA) de les transferències; no pas per millorar-ne el rendiment, sinó per satisfer els requisits específics d'adreçament d'un dispositiu (especialment els dispositius de 32 bits en sistemes amb ampli front, sempre a través de l'Extensió de Direcció Física). Els controladors de dispositius de Microsoft de Windows és molt probable que utilitzin el doble buffer.

El doble buffering també es fa servir com una tècnica per facilitar d'entrellaçar o desentrellaçar senyals de vídeo.

Vegeu també

[modifica]

Referències

[modifica]

Enllaços externs

[modifica]