Domanda

Ok, quindi sto cercando di soppesare i pro ei contro di utilizzare varie differenti tecniche di compressione texture. Trascorro 99,999% del mio tempo di codifica giochi sprite 2D per le macchine Windows che utilizzano DirectX.

Finora ho guardato confezionamento tessitura (SpriteSheets) con alfa-rifilatura e che sembra un modo decente per ottenere un po 'più di prestazioni. Ora sto iniziando a guardare il formato di texture che sono memorizzati in; Al momento tutto viene memorizzato come .pngs *.

Ho sentito dire che * .DDS file sono buone, soprattutto se utilizzato con DXT5 (/ 3/1 a seconda del compito) di compressione come la trama rimane compresso in VRAM? Anche la gente dice che così come sono già DirectDraw Superfici Caricano in molto, molto più veloce anche.

Così ho creato un'applicazione per testare il tutto; Chiamo la linea inferiore a 20 volte, rilasciando la consistenza tra ogni chiamata.

    for (int i = 0; i < 20; i++)
 {
  if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice, L"Test.dds", &g_pTexture ) ) )
  {
   return E_FAIL;
  }

  g_pTexture->Release();
  g_pTexture = NULL;
 }

Ora, se provo questo con una texture DXT5, ci vuole più tempo per completare 5x che con carico in un semplice * .PNG. Ho sentito dire che se non si generano Mipmaps può andare più lento, così ho controllato due volte che. Poi ho cambiato il programma che stavo usando per generare il file * .DDS, il passaggio a proprio nvcompress.exe di NVIDIA, ma nessuna di queste ha avuto alcun effetto.

Modifica Ho dimenticato di dire che i file (sia * .png e * .dds) sono entrambi la stessa immagine, appena salvato in diversi formati. (Stesse dimensioni, quantità di alfa, tutto!)

EDIT 2: Quando si utilizzano i seguenti parametri si carichi in quasi 2,5 volte più veloce e consuma molto meno di VRAM

 D3DXCreateTextureFromFileEx( g_pd3dDevice, L"Test.dds", D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2, D3DX_FROM_FILE, 0, D3DFMT_FROM_FILE, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_FILTER_NONE, 0, NULL, NULL, &g_pTexture )

Tuttavia, ora sto perdendo tutta la mia trasparenza nella texture, ho guardato la consistenza DXT5 e sembra bene in Paint.NET e DirectX DDS Viewer. Tuttavia quando caricato in tutta la trasparenza si trasforma in nero pieno. Colorkey problema?

EDIT 3: Ignora che l'ultimo pezzo, mi veniva idiota e nella fretta "esempio veloce" avevo dimenticato di attivare alpha-blending sul D3DXSprite-> Begin (). Doh!

È stato utile?

Soluzione

È necessario distinguere tra il formato che i file sono memorizzati in su disco e il formato in cui le texture in ultima analisi, utilizzano nella memoria video. DXT texture compresse offrono un buon equilibrio tra l'utilizzo di memoria e qualità nella memoria video, ma altre tecniche di compressione come PNG o JPEG generalmente risultato in file più piccoli e / o una migliore qualità su disco.

file DDS hanno il vantaggio che essi supportano DXT formatta direttamente e sono disposti su disco nello stesso modo in cui DirectX si aspetta che i dati per essere disposti in memoria in modo non c'è il tempo di CPU minima richiesta dopo che sono stati caricati per convertirli in un formato l'hardware può utilizzare. Essi sostengono anche catene di pre-generati mipmap che formati come PNG non supportano. La compressione di un'immagine in formati DXT è abbastanza processo che richiede tempo in modo che generalmente vuole evitare di farlo su carico, se possibile.

Un file DDS con mipmap pre-generati che è la stessa dimensione e utilizza lo stesso formato come la trama di memoria video che si prevede di creare da esso utilizzerà il tempo di CPU almeno di qualsiasi formato standard. È necessario assicurarsi che si dica D3DX di non eseguire alcuna scalatura, filtraggio, conversione di formato o di generazione mipmap per garantire che anche se. D3DXCreateTextureFromFileEx consente di specificare le bandiere che impediscono conversioni interne che accadono (D3DX_DEFAULT_NONPOW2 per la larghezza e l'altezza dell'immagine se l'hardware supporta non potere delle due texture, D3DFMT_FROM_FILE per prevenire la generazione mipmap o conversione di formato, D3DX_FILTER_NONE per evitare qualsiasi filtraggio o ridimensionamento).

tempo di CPU è solo metà della storia però. Queste CPU giorni sono abbastanza veloci e hard disk sono relativamente lenti in modo a volte il tempo di caricamento totale può essere più breve se si carica un più piccolo formato di file compresso come PNG o JPG e poi fare un sacco di lavoro della CPU per convertirlo che se si carica un file più grande come un DDS e basta fare un memcpy nella memoria video. Un approccio comune che dà buoni risultati è quello di comprimere i file DDS e decomprimerli per il caricamento veloce da disco e il costo minimo della CPU per la conversione di formato.

formati di compressione come PNG e JPG in grado di comprimere alcune immagini in modo più efficace rispetto ad altri. DDS è un rapporto di compressione fisso - una data risoluzione dell'immagine e del formato sempre comprimere la stessa dimensione (questo è il motivo per cui è più adatto per la decompressione in hardware). Se stai usando semplici immagini non rappresentativi per i test (ad esempio un colore uniforme o un motivo semplice) e poi il file PNG è probabile che sia molto piccolo e quindi caricherà dal disco più veloce di immagini di un gioco tipico di quanto sarebbe.

Altri suggerimenti

Confronto caricamento di un PNG standard e poi la compressione per il tempo necessario a caricare un file DDS.

Ancora non riesco a capire perché un PNG caricherebbe più velocemente rispetto allo stesso DXT5 trama compressa. Per uno che sarà un bel po 'più piccola e quindi dovrebbe caricare su disco forma più veloce! È questa texture DXT5 la stessa della trama PNG? cioè sono la stessa dimensione?

Hai provato a giocare con D3DXCreateTextureFromFileEx? Lei ha molto più controllo su ciò che sta accadendo. Essa può aiutarti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top