Risposte:
I file JPG e PNG saranno quasi sempre più piccoli su disco che in memoria; devono essere decompressi al volo per acquisire dati RGB grezzi, quindi richiedono più potenza di elaborazione per il caricamento e più RAM in seguito. Così tanti motori moderni scelgono di archiviare sul disco lo stesso formato che hanno in memoria, portando a file delle stesse dimensioni dei requisiti di memoria della trama (ma anche più grandi di un PNG o JPG). RGB / RGBA e S3TC / DXTn / BCn sono i formati più utilizzati, perché vengono letti direttamente in memoria senza alcuna elaborazione (le trame DXT sono precompresse).
Quindi, queste sono le dimensioni per i diversi formati di trama comuni:
Se usi un'immagine con mipmap , la trama richiederà 4/3 di memoria. Inoltre, la larghezza e l'altezza della trama possono essere arrotondate internamente per essere una potenza di due su hardware vecchio o meno capace e su hardware molto limitato, costretto anche ad essere un quadrato.
Maggiori informazioni su DXT: è una compressione con perdita; questo significa che alcuni dati di colore vengono persi quando si comprime la trama. Ciò ha un impatto negativo sulla trama, distorcendo i bordi nitidi e creando "blocchi" su pendenze; ma i vantaggi sono di gran lunga migliori degli svantaggi (se hai una trama che sembra orribilmente brutta in DXT, mantienila non compressa; gli altri compenseranno la perdita di dimensioni). Inoltre, poiché i pixel sono compressi da blocchi di dimensioni fisse, la larghezza e l'altezza della trama devono essere un multiplo di quattro.
Ovviamente: dipende dal formato.
Prendiamo una trama quadrata di 256 x 256 pixel. Se non è compresso a 32 bit con un canale alfa ( Color
in XNA), sono necessari 256 KB ( 256*256*4
byte).
I formati a 16 bit (ad es . :)Bgr565
avranno ovviamente la metà della dimensione - 128 KB .
Quindi si arriva ai formati compressi. In XNA hai DXT1, DXT3 e DXT5 (noto anche come compressione S3 ). Questo è un formato di compressione con perdita di dati. È anche un formato basato su blocchi, il che significa che puoi campionare da esso (perché sai in quale blocco si trova un pixel). È anche più veloce, perché usi meno larghezza di banda.
Il rapporto di compressione di DXT1 è 8: 1 e per DXT3 e DXT5 è 4: 1.
Quindi un'immagine DXT1 di 256x256 è 32 KB . E DXT3 o DXT5 è 64 KB .
E poi c'è il mipmapping . Se abilitato, crea una serie di immagini nella memoria grafica della metà delle dimensioni della precedente. Quindi per la nostra immagine 256x256: 128x128, 64x64, 32x32, 16x16, 8x8, 4x4, 2x2, 1x1. Una trama con mipmapping ha approssimativamente il 133% delle dimensioni dell'originale.
La maggior parte delle GPU può leggere solo un formato di compressione molto specifico. per esempio. BC *, DXT *, non formati come png. Quindi sì, è vero per la maggior parte che un .png occuperà più spazio nella memoria video che sul disco.
Le trame possono essere archiviate compresse o non compresse nella memoria video e nella memoria di sistema.
Per le trame non compresse, la regola generale è che occuperà la stessa quantità di spazio nella memoria video della forma non compressa nella memoria di sistema.
Per trame compresse DXT1. la GPU memorizza 8 byte per ogni riquadro 4x4 nella trama. I dati non compressi (a 8 bit per canale RGB) sarebbero normalmente 4x4x3 = 48 byte, quindi questo è un rapporto di compressione di 6: 1. Per le trame compresse DXT3 / DXT5, la GPU memorizza 16 byte per ogni riquadro 4x4 nella trama. Questo è un rapporto di compressione leggermente inferiore di 3: 1.
Ci sono alcuni avvertimenti con trame non compresse e compresse:
La maggior parte della memoria è allocata in pagine (la cui dimensione varia tra le GPU) di dimensioni fisse. per esempio. 4KB e spesso non allocato e condiviso con altri dati GPU. Vale a dire. se l'impronta della trama è inferiore alla dimensione della pagina, l'impronta nel mem video sarà spesso comunque la dimensione della pagina.
Alcuni gpus hanno requisiti di allineamento molto specifici. In passato, alcune GPU avevano il requisito che le trame avessero una potenza di 2 dimensioni. Ciò è stato spesso richiesto per supportare una rappresentazione sfrigolata (vedi Morton Ordering: http://en.wikipedia.org/wiki/Z-order_(curve )) per migliorare la località di accesso durante il campionamento dalla texture. Ciò significava che le trame di dimensioni dispari sarebbero state imbottite al fine di preservare questi requisiti (in genere questa imbottitura è gestita dal conducente). Sebbene l'ordine dei mortoni non sia necessariamente utilizzato nella moderna GPU, potrebbe ancora esserci gonfiore per supportare i requisiti specifici della GPU.
Rappresentazioni multiple della trama possono esistere in memoria in qualsiasi momento, soprattutto se si utilizzano blocchi di scarto su di esse. Questo può gonfiare l'utilizzo della memoria fino a quando le rappresentazioni non vengono più utilizzate dalla gpu (che in genere è alcuni frame dietro il rendering della CPU)
Se si abilita il mipmapping, i mip aggiuntivi consumeranno in media circa un terzo del livello di mip di base. YMMV basato sulle avvertenze di cui sopra.
AFAIK è la larghezza dell'immagine * altezza * BPP, indipendente se si tratta di un PNG, JPG o BMP. Non so come siano disposti DDS o altri formati comprimibili.
La mappatura Mip aumenterà la necessità di memoria video.
Le mie conoscenze in questo argomento potrebbero essere un po 'datate. Ho abbandonato il 3D qualche tempo fa.