Um png grande no disco pode ocupar apenas alguns megabytes, mas imagino que no gpu o mesmo png seja armazenado em um formato não compactado, que ocupa muito mais espaço. Isso é verdade? Se é verdade, quanto espaço?
Os arquivos JPG e PNG quase sempre serão menores no disco do que na memória; eles precisam ser descompactados on-the-fly para adquirir dados RGB brutos, exigindo mais poder de processamento para o carregamento e mais RAM posteriormente. Muitos mecanismos modernos optam por armazenar o mesmo formato no disco que na memória, levando a arquivos que têm o mesmo tamanho que os requisitos de memória da textura (mas também maiores que um PNG ou JPG). RGB / RGBA e S3TC / DXTn / BCn são os formatos mais amplamente utilizados, porque são lidos diretamente na memória sem nenhum processamento (as texturas DXT são pré-compactadas).
Portanto, esses são os tamanhos para diferentes formatos de textura comuns:
Se você usar uma imagem com mipmaps , a textura precisará de 4/3 de memória. Além disso, a largura e a altura da textura podem ser arredondadas internamente para ser uma potência de dois em hardware antigo ou menos capaz e em um hardware muito limitado, também forçado a ser quadrado.
Mais informações sobre o DXT: é uma compactação com perdas; isso significa que alguns dados de cores são perdidos ao compactar a textura. Isso tem um impacto negativo na sua textura, distorcendo bordas nítidas e criando "blocos" em gradientes; mas os benefícios são muito melhores do que as desvantagens (se você tiver uma textura que parece terrivelmente ruim no DXT, mantenha-a descompactada; os outros compensarão a perda de tamanho). Além disso, como os pixels são compactados por blocos de tamanho fixo, a largura e a altura da textura devem ser múltiplas de quatro.
Obviamente: depende do formato.
Vamos dar uma textura quadrada de 256 por 256 pixels. Se não estiver compactado em 32 bits com um canal alfa (
Color
em XNA), serão necessários 256 KB (256*256*4
bytes).Formatos de 16 bits (por exemplo :)
Bgr565
obviamente terão metade do tamanho - 128 KB .Então você entra nos formatos compactados. No XNA, você tem DXT1, DXT3 e DXT5 (também conhecido como S3 Compression ). Este é um formato de compactação com perdas. Também é um formato baseado em bloco - o que significa que você pode fazer uma amostra dele (porque você sabe em qual bloco o pixel está). Também é mais rápido, porque você usa menos largura de banda.
A taxa de compactação do DXT1 é 8: 1 e para o DXT3 e o DXT5 é 4: 1.
Portanto, uma imagem DXT1 de 256x256 tem 32 KB . E DXT3 ou DXT5 é 64KB .
E depois há o mipmapping . Se isso estiver ativado, isso criará uma série de imagens na memória gráfica com metade do tamanho da anterior. Portanto, para a nossa imagem de 256x256: 128x128, 64x64, 32x32, 16x16, 8x8, 4x4, 2x2, 1x1. Uma textura com mipmapping é aproximadamente 133% do tamanho do original.
fonte
A maioria das GPUs pode ler apenas um formato de compactação muito específico. por exemplo. BC *, DXT *, não formatos como png. Portanto, sim, na maioria das vezes é verdade que um .png ocupará mais espaço na memória de vídeo do que no disco.
As texturas podem ser armazenadas compactadas ou descompactadas na memória de vídeo e na memória do sistema.
Para texturas não compactadas, a regra geral é que ela ocupará a mesma quantidade de espaço na memória de vídeo e na forma não compactada na memória do sistema.
Para texturas compactadas DXT1. a GPU armazena 8 bytes para cada bloco 4x4 em sua textura. Os dados não compactados (a 8 bits por canal RGB) normalmente seriam 4x4x3 = 48 bytes, portanto, essa é uma taxa de compactação de 6: 1. Para texturas compactadas DXT3 / DXT5, a GPU armazena 16 bytes para cada bloco 4x4 em sua textura. Essa é uma taxa de compressão um pouco menor de 3: 1.
Existem algumas ressalvas com as texturas não compactadas e compactadas:
A maior parte da memória é alocada em páginas (cujo tamanho varia entre as GPUs) de tamanho fixo. por exemplo. 4KB e muitas vezes isso não é subalocado e compartilhado com outros dados da GPU. Ou seja. se a sua pegada de textura for menor que o tamanho da página, a pegada em vid mem geralmente continuará sendo o tamanho da página.
Alguns gpus têm requisitos de alinhamento muito específicos. No passado, algumas GPUs exigiam que as texturas tivessem uma potência de 2 em tamanho. Isso geralmente era necessário para oferecer suporte a uma representação distorcida (consulte Morton Ordering: http://en.wikipedia.org/wiki/Z-order_(curve )) para melhorar a localidade de acesso ao coletar amostras da textura. Isso significava que texturas de tamanhos ímpares seriam preenchidas para preservar esses requisitos (normalmente esse preenchimento é tratado pelo driver). Embora a ordem morton não seja necessariamente usada nos gpus modernos, ainda pode haver inchaço para suportar os requisitos específicos do gpu.
Várias representações de sua textura podem existir na memória a qualquer momento, especialmente se você estiver usando bloqueios de descarte. Isso pode aumentar o uso de memória até que as representações não sejam mais usadas pela gpu (que geralmente está alguns quadros atrás da renderização da CPU)
Se você ativar o mipmapping, os mips adicionais consumirão, em média, cerca de um terço do nível mip básico. YMMV com base nas advertências acima.
fonte
AFAIK é a largura das imagens * altura * BPP, independente se for PNG, JPG ou BMP. Não sei como são dispostos o DDS ou outros formatos compactáveis.
O mapeamento Mip aumentará a necessidade de memória de vídeo para.
Meu conhecimento neste tópico pode estar um pouco desatualizado. Eu abandonei o 3D há um tempo atrás.
fonte