Framebuffer
Frame buffer sau memoria de imagine (limba engleză frame - o singură imagine, tampon - stocare intermediară) face parte din memoria grafică a computerelor și corespunde unei digitale copie a imaginii monitorului . Aceasta înseamnă că fiecărui pixel al ecranului i se poate atribui o anumită zonă a bufferului de cadre care conține valoarea sa de culoare tradusă digital. Din anii 1990, framebuffer-ul a fost localizat în principal pe placa grafică .
Cerințe de memorie
Dimensiunea minimă necesară a bufferului cadrului depinde de doi factori: adâncimea de culoare utilizată (mai precis: formatul pixelilor) și rezoluția imaginii utilizată .
Adâncimea culorii
Adâncimea de culoare a bufferului cadrului definește numărul maxim de culori sau nuanțe de culoare afișate pe ecran în același timp. În zona computerelor compatibile cu computerul IBM , dimensiunile date în lista următoare au fost și sunt comune. Formatele de pixeli specificate indică câți biți pe pixel sunt alocați canalelor individuale de culoare (roșu, verde, albastru, canal alfa ) - această informație lipsește pentru modurile de culoare care utilizează culori indexate (palete) deoarece nu are niciun sens.
- 1 bit pe pixel, două culori (de obicei deschise și întunecate pe un monitor monocrom )
- 2 biți pe pixel, patru culori
- CGA : paletă cu 4 culori din 16 posibile
- 4 biți pe pixel, 16 culori
- EGA : Paletă cu 16 culori din 64 posibile
- 8 biți pe pixel, 256 de culori
- VGA : Paletă cu 256 de culori din 262144 posibile
- 15 biți pe pixel, 32768 culori
- Culoare reală : format pixel 5-5-5, adică H. 5 biți pe canal de culoare (adică 32 de niveluri de intensitate pe canal)
- 16 biți pe pixel, 65536 culori
- Culoare înaltă : format pixel 5-6-5, adică H. 5 biți pentru roșu și albastru (32 nivele de intensitate) și 6 biți pentru verde (64 nivele de intensitate)
- alternativ și 4-4-4-4, adică H. 4 biți pe canal de culoare (16 niveluri de intensitate), prin care ultimii patru biți sunt fie neutilizați, fie folosiți ca canal alfa (vezi culoarea adevărată pe 32 de biți)
- 24 biți pe pixel: 16777216 culori
- Culoare adevărată : format pixel 8-8-8, adică H. 8 biți pe canal de culoare (256 nivele de intensitate)
- 32 de biți pe pixel
- True Color: format pixel 8-8-8-8, adică H. 8 biți pe canal de culoare (256 nivele de intensitate)
- Cei 8 biți care au fost adăugați la culoarea adevărată pe 24 de biți nu sunt în mod normal folosiți; Cu toate acestea, pe computerele cu arhitectură pe 32 de biți, procesarea valorilor pe 32 de biți este mai eficientă decât cea a valorilor pe 24 de biți, deoarece aceasta corespunde exact lungimii cuvântului procesorului, motiv pentru care tampoanele cadrelor cu culori adevărate mai ales în ciuda cerinței de memorie cu 33% mai mari Utilizați adâncimea de culoare pe 32 de biți.
Cu hardware-ul grafic care funcționează cu planuri de biți (de exemplu, Amiga ), 3, 5, 6 și 7 biți pe pixel cu 8, 32, 64 sau 128 culori corespunzătoare sunt, de asemenea, obișnuite pentru culorile indexate.
În grafica computerizată 3D, sunt utilizate și tampoane de cadre cu o precizie mai mare. Acolo, determinarea culorii unui pixel necesită adesea mai multe etape de calcul, prin care pot apărea erori de rotunjire cu fiecare rezultat intermediar , care sunt rapid vizibile în formatele convenționale de tampon de cadru și au un efect perturbator.
Cu aceste formate mai precise, valorile canalului de culoare sunt interpretate ca valori virgulare pe o scară de la 0,0 la 1,0, astfel încât gestionarea este simplificată atunci când se utilizează mai multe formate de pixeli.
- FX8
- Punct fix de 8 biți per canal de culoare , astfel 256 de gradări de culoare scalate liniar
- identic cu cei 32 de biți per pixel de mai sus. Fie că luați cele 256 de valori diferite per canal de culoare ca număr întreg între 0 și 255 sau ca valoare fixă între 0,0 și 1,0 este doar o chestiune de interpretare.
- contrast maxim 255: 1, prin urmare potrivit pentru redarea cu gamă dinamică redusă (LDR), așa cum poate fi afișat de ecranele normale de toate tipurile
- FX12
- Punct fix de 12 biți pe canal de culoare, astfel 4096 gradări de culoare scalate liniar
- precizie mai mare decât FX8
- contrast maxim 4095: 1, potrivit pentru redarea Low Dynamic Range (LDR)
- FX16
- Punct fix de 16 biți pe canal de culoare, astfel 65536 gradări de culoare scalate liniar
- precizie mai mare decât FX12
- contrast maxim 65535: 1, potrivit pentru redarea Gama dinamică medie (MDR)
- PC16
- Punct plutitor de 16 biți per canal de culoare (din care exponent de 5 biți și mantisă de 10 biți ), astfel 32768 gradări de culoare scalate exponențial
- Comparativ cu FX16, scara exponențială permite o rezoluție mult mai fină pentru valori mici, dar este mai puțin precisă pentru valori mai mari.
- contrast maxim aprox. , potrivit pentru randarea cu un interval dinamic ridicat (HDR) .
- FP24
- Punct plutitor de 24 de biți pe canal de culoare (inclusiv exponent de 7 biți și mantisă de 16 biți), astfel peste 8 milioane de gradații de culoare scalate exponențial
- o precizie mai mare decât FP16, prin urmare foarte potrivit pentru redarea HDR
- FP32
- Variantă mobilă pe 32 de biți pe canal de culoare (din care exponent pe 8 biți și mantisă pe 23 de biți), deci peste 2 miliarde de gradații de culoare scalate exponențial
- precizie chiar mai mare decât FP24
Rezoluția imaginii
Rezoluția imaginii indică din câte pixeli constă framebuffer-ul. De obicei, specificați numărul orizontal și vertical de pixeli, ceea ce înseamnă că puteți calcula și raportul de aspect direct; 4: 3, 5: 4 și 16:10 sunt frecvente aici.
| Rezoluție (în pixeli) |
Număr de pixeli |
aspect raport |
|---|---|---|
| 320 × 200 | 64.000 | 16:10 |
| 640 × 200 | 128.000 | 32:10 a |
| 640 × 480 | 307.200 | 4: 3 |
| 800 × 600 | 480.000 | 4: 3 |
| 1024 × 768 | 786,432 | 4: 3 |
| 1280 × 1024 | 1.310.720 | 5: 4 |
| 1440 × 900 | 1.296.000 | 16:10 |
| 1680 × 1050 | 1.764.000 | 16:10 |
| 1600 × 1200 | 1.920.000 | 4: 3 |
| 1920 × 1200 | 2.304.000 | 16:10 |
| 2048 × 1536 | 3.145.728 | 4: 3 |
| 2560 × 1600 | 4.096.000 | 16:10 |
Exemple
-
Mod text (de ex., Atunci când porniți un computer compatibil IBM cu BIOS )
Pentru o consolă cu 80 × 25 de caractere, fiecare caracter și culoarea acestuia fiind salvate cu câte 8 biți fiecare (adică un total de 16 biți), tamponul de cadre ocupă 80 × 25 × 16 = 32000 biți = 4 KB. - Buffere de cadre EFI în computerele moderne cu interfață unificată de firmware extensibilă (UEFI)
Cu EFI 1.x, adaptorul grafic universal (UGA) a fost un driver EFI independent de hardware disponibil pentru a utiliza un buffer de cadre video simplu. Acesta a fost înlocuit cu UEFI 2.x de către Graphics Output Protocol (GOP), care poate utiliza acum și modul text independent de placa grafică. Atât UGA cât și GOP înlocuiesc complet BIOS-ul video (pe scurt VBIOS, doar pe computerele cu BIOS) - Funcțiile VBIOS nu mai pot fi folosite de driverul grafic, astfel încât unele drivere grafice PC mai vechi sub (U) EFI nu funcționează cu hardware identic, dar cu CSM activat (emularea BIOS a EFI sau UEFI). Sistemele de operare și driverele de dispozitiv trebuie, prin urmare, să utilizeze EFI-UGA sau -GOP pentru a putea utiliza textul (cu GOP) sau modul video și alte funcții tampon de cadru firmware. În Linux există cuefifbun driver grafic generic framebuffer care funcționează pe toate computerele EFI și, prin urmare, independent și de placa grafică specifică. Windows și macOS folosesc, de asemenea, bufferul de cadre EFI, dar din moment ce este disponibil numai fără accelerare grafică, este disponibil doar în modul restricționat. -
Mod grafic (de exemplu sub Windows sau X Window System sub Linux)
Cu o rezoluție a ecranului de 1024 × 768 pixeli și o adâncime de culoare de 24 de biți, tamponul de cadre ocupă 1024 × 768 × 24 = 18874368 biți = 2,25 MiB .
| Lățime × înălțime × culori | Cerință de memorie * | Mod implicit |
|---|---|---|
| 320 × 200 × 2 | ≈ 8 KB (8 kB) |
C64 |
| 320 × 200 × 16 | ≈ 32 KB
(32 kB) |
Atari ST |
| 640 × 200 × 2 | ≈ 16 KB (16 kB) |
CGA |
| 750 × 350 × 2 | ≈ 32 KB | Hercule |
| 640 × 350 × 16 | ≈ 109 KB (112 kB) |
EGA |
| 640 x 400 x 1 | ≈ 32 KB
(32 kB) |
Atari ST |
| 640 × 480 × 16 | 150 KB | VGA |
| 320 × 200 × 256 | 62,5 KB (64 kB) |
VGA |
| 640 × 480 × 256 | 300 KB | VGA extins |
| 800 × 600 × 256 | 468,75 KB (480 kB) |
SVGA |
| 1024 × 768 × 256 | 768 KB | XGA |
| 1024 × 768 × 64k | 1,5 MB | XGA |
| 1024 × 768 × TrueColor | 2,25 MB | XGA |
| 1280 × 960 × TrueColor | ≈ 3,5 MB | SXGA |
| 1400 × 1050 × TrueColor | ≈ 4,2 MB | SXGA + |
| 1600 × 1200 × TrueColor | ≈ 5,5 MB | UXGA |
| 1920 × 1200 × TrueColor | ≈ 6,6 MB | WUXGA |
| 2048 × 1536 × TrueColor | 9 MB | SUXGA |
| 2560 × 960 × TrueColor | ≈ 7 MB | Dual SXGA |
| 2560 × 1600 × TrueColor | ≈ 12 MB | WQXGA |
În cazul TrueColor, prezentarea generală ia în considerare faptul că datele sunt stocate intern cu 24 de biți.
Îmbunătățiri
Datorită insuficiențelor în continuitatea secvenței de imagine și pentru a crește în continuare calitatea generală a afișajului, conceptul de tampon de cadre a fost revizuit în timp. Un framebuffer pe sistemele actuale corespunde mai multor buffere.
- În bufferul dublu ( buffer dublu ) al bufferului cadrului în două regiuni ( bufferul frontal și bufferul din spate ) împărțit.
- În bufferul triplu ( buffer triplu ) al bufferului cadrului este (1 în trei zone tampon frontal și 2 BackBuffer împărțit).
Linux framebuffer
Dispozitivul Linux Framebuffer ( pe scurt fbdev ) este un strat de abstractizare independent de hardware sub Linux pentru a afișa grafică pe consolă sau cu o fereastră X (xf86_fbdev). Dispozitivul framebuffer nu se bazează pe biblioteci specifice sistemului, cum ar fi SVGALib sau X Window System și, prin urmare, este o alternativă de economisire a resurselor la serverul X larg răspândit pe care se bazează astăzi majoritatea interfețelor grafice pentru Linux. A fost inclus în nucleul standard pentru toate platformele de la versiunea 2.1.107 a nucleului Linux.
Inițial, a fost implementat pentru Linux68k pentru a emula un mod text pe sistemele corespunzătoare (Amiga, Atari, Macintosh) cu o accelerație hardware scăzută și a fost extins abia ulterior la platforma compatibilă IBM-PC.
În prezent, framebuffer-ul poate fi utilizat direct de diferite programe precum MPlayer și biblioteci precum GGI, SDL , GTK + și Qt Extended . Conceptul de economisire a resurselor face ca utilizarea să fie deosebit de interesantă pentru sistemele încorporate.
În special, este utilizat de diferite distribuții ( Ubuntu , openSUSE ) pentru a permite ieșirea grafică sub formă de ecran de pornire în timpul bootstrapping-ului .
Cel mai frecvent utilizat driver VESA framebuffer (vesafb) se bazează pe specificații uniforme ale standardelor video și permite astfel accesul la plăci grafice în mare parte independente de producător. Aceasta înseamnă că este posibilă și o implementare open-source. În plus, diferiți producători de cipuri grafice ( Nvidia : rivafb, nvidiafb; AMD : radeonfb) au adus pe piață drivere proprietare.
Dispozitivul framebuffer a devenit cunoscut pentru capacitatea sa de a afișa utilizatorului o siglă Tux în timpul procesului de încărcare a nucleului Linux . Pentru a face acest lucru, totuși, trebuie mai întâi să fie conținut în kernel și activat prin specificarea parametrului la următoarea repornire de către încărcătorul de încărcare , care încarcă și sistemul de operare în memoria principală video.
Următorul arată două exemple în care un driver AMD este încărcat cu o rezoluție a imaginii de 1024 × 768 pixeli, o adâncime de culoare de 8 biți pe pixel și o rată de reîmprospătare de 76 Hz:
- Exemplu de fișier de configurare LILO
# LILO configuration file boot = /dev/sda1 # Linux bootable partition config begins image = /vmlinuz append = "video=atyfb:1024x768-8@76,font:SUN8x16"
- Exemplu de fișier de configurare GRUB
# GRUB configuration file # For booting LINUX title Linux kernel (hd0, 0) /vmlinuz video=atyfb:1024x768-8@76,font:SUN8x16 root=/dev/hda1
Un modul kernel nu trebuie neapărat să fie scris pentru acces hardware la dispozitivul tampon cadru. Aplicația are, de asemenea, opțiunea de a /dev/fb*accesa dispozitivul în modul utilizator prin fișierul dispozitivului și de a-l scrie în memoria grafică. Următorul exemplu demonstrează modul în care limbajul de programare C poate fi folosit pentru a scrie liniar în buffer-ul cadrului. Aici valoarea hexazecimală 0x000000FF (binară: 0b00000000000000000000000011111111) este setată pentru fiecare pixel:
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv) {
int row, col, width, height, bitspp, bytespp;
unsigned int *data;
// Öffnen des Gerätes
int fd = open("/dev/fb0", O_RDWR);
// Informationen über den Framebuffer einholen
struct fb_var_screeninfo screeninfo;
ioctl(fd, FBIOGET_VSCREENINFO, &screeninfo);
// Beende, wenn die Farbauflösung nicht 32 Bit pro Pixel entspricht
bitspp = screeninfo.bits_per_pixel;
if(bitspp != 32) {
// Ausgabe der Fehlermeldung
printf("Farbaufloesung = %i Bits pro Pixel\n", bitspp);
printf("Bitte aendern Sie die Farbtiefe auf 32 Bits pro Pixel\n");
close(fd);
return 1; // Für den Programmabbruch geben wir einen Rückgabetyp != 0 aus.
}
width = screeninfo.xres;
height = screeninfo.yres;
bytespp = bitspp/8; //Bytes pro Pixel berechnen
// Überprüfen ob der Typ unsigned int die gleiche Byte-Grösse wie ein Pixel besitzt.
// In unserem Fall 4 Byte (32 Bit), falls nicht wird das Programm beendet
if(sizeof(unsigned int) != bytespp) {
close(fd);
return 1;
}
// Zeiger auf den Framebufferspeicher anfordern
data = (unsigned int*) mmap(0, width * height * bytespp, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
// In den Framebuffer-Speicher schreiben. Hier wird Pixel für Pixel auf
// die Farbe 0x000000FF (Blau) gesetzt, da ein Pixel das AARRGGBB Format hat
for(row = 0; row < height; row++)
for(col = 0; col < width; col++)
data[row * width + col] = 0xFF;
// Zeiger wieder freigeben
munmap(data, width * height * bytespp);
// Gerät schließen
close(fd);
// Rückgabewert
return 0;
}
Vezi si
- DirectFB , Direct frame buffer, o bibliotecă de programe bazată pe bufferul de cadre Linux
Dovezi individuale
- ↑ Edgar Hucek: Ce este efifb? În: Arhivele nucleului Linux. Adus la 25 august 2020 .