2013-01-25 12 views
5

Ho intenzione di chiedere questo per un bel po 'ora. Sto creando questo gioco in cui disegno uno sfondo molto grande. Ma il problema è (ovviamente), quando inserisco più elementi nel gioco, ottengo un'eccezione OutOfMemory.Eccezione OutOfMemory: la compressione delle immagini ridurrà le dimensioni dell'heap?

Quello che ho intenzione di chiedere è, la compressione dell'immagine ridurrà l'allocazione della dimensione heap? Ad esempio, il mio sfondo PNG (3000 per 2000 in pixel) è di circa 1,5 MB. Dopo una serie di compressioni PNG (tramite software come TinyPNG e PNGGauntlet), la dimensione dello sfondo è stata drasticamente ridotta a 712 KB. L'immagine compressa qui ha ancora le stesse dimensioni dell'originale (3000 per 2000).

L'allocazione della dimensione heap per la dimensione dello sfondo originale (1,5 MB) è uguale a quella compressa (712 KB)?

+1

Domanda molto bella. La risposta è probabilmente "sì", perché i sistemi grafici necessitano di immagini non compresse da disegnare sullo schermo, ma non ne sono sicuro. Vorrei provare a ridurre lo sfondo, diciamo, 1500 per 1000, e vedere se il consumo di memoria diminuisce di quattro volte. – dasblinkenlight

+0

Sì, lo proverò non appena avrò finito con gli altri moduli. Non sono sicuro di come procedere, ma dopo aver eseguito le compressioni di immagine, il FPS del gioco è aumentato drasticamente. Tuttavia, non sono completamente sicuro che la dimensione dell'heap sia stata ridotta. – dabaerju

risposta

1

La risposta è sì, sia l'immagine compressa sia quella non compressa occupano la stessa quantità di memoria: alla fine si trasformano in una griglia di valori R, G, B (, A).
L'unica volta che è possibile salvare della memoria è se si utilizza una forma di compressione supportata direttamente dalla GPU (ad esempio, compressione S3TC per trame OpenGL).

La compressione riduce due elementi: la dimensione del file su disco e la quantità di tempo di I/O necessario per caricare il file (sebbene questo salvataggio possa essere compensato dal processo di decompressione).

Si potrebbe comunque guardare il caricamento dell'immagine in un tipo di bitmap diverso da ARGB_8888 (ad esempio RGB_565) - ciò ridurrà la quantità di memoria necessaria per memorizzare la bitmap (ma la qualità dell'immagine sarà ridotta).

+0

Sono rimasto molto perplesso sul motivo per cui ho continuato a ottenere un'eccezione OutOfMemory anche dopo aver compresso queste immagini. Per quanto riguarda questo, ora so che la compressione migliora solo le prestazioni sullo schermo e riduce i tempi di caricamento. Grazie mille per averlo chiarito! Immagino che non ci sia altro modo se non quello di consentire dimensioni di heap grandi o ridurre le dimensioni del file. – dabaerju

+1

È possibile caricare l'immagine in un tipo di bitmap diverso da ARGB_8888 (ad esempio RGB_565 - questo userebbe metà della memoria). –