Evite a compactação dupla de recursos

13

Estou usando .pngs para minhas texturas e um sistema de arquivos virtual em um .ziparquivo para o meu projeto de jogo. Isso significa que minhas texturas são compactadas e descomprimidas duas vezes. Quais são as soluções para esse problema de dupla compressão? Uma solução que ouvi falar é usar .tgas para texturas, mas parece que há séculos atrás, desde que ouvi isso. Outra solução é implementar a descompressão no GPUe, como isso é rápido, esquecer a sobrecarga.

user1095108
fonte
2
Relacionado: se você usou jpegs, muitos programas zip com seu próprio formato são capazes de comprimir até 20% deles, para que não seja necessariamente tão ruim assim. Qual é o ponto da dupla compressão com que você mais se preocupa? Demora muito tempo? Muitos formatos até armazenam dados já compactados literalmente e não fazem nenhuma descompressão neles.
PlasmaHH

Respostas:

17

O formato zip suporta vários algoritmos de compactação diferentes. Você pode usar um algoritmo diferente para cada arquivo no arquivo morto. Quando você deseja armazenar arquivos já compactados que não se beneficiam de compactação adicional (como PNG) em um arquivo compactado, é possível codificar esses arquivos com o algoritmo "armazenado" que não é compactado. A caixa de diálogo "Adicionar ao arquivo" do 7-zip permite que você escolha isso em "Força da compressão".

Mas quando você não possui apenas imagens, mas também outros recursos mais compactáveis ​​em seus arquivos, pode ser bastante tedioso escolher o algoritmo para cada arquivo. Nesse caso, você pode optar por um formato de imagem não compactado em um arquivo compactado.

O formato TGA conhece vários modos diferentes, dos quais alguns são compactados e outros não. Quando você não deseja usar a compactação, escolha a opção correta nas opções de exportação do editor gráfico que está usando. Outro formato de imagem sem compactação é o BMP (Windows Bitmap).

Aqui está um teste que eu fiz. Adicionei a mesma imagem (um ativo do meu projeto atual) em diferentes formatos várias vezes a um arquivo zip, alguns com o algoritmo "deflate" na força normal e outro com "store". Desculpe pela GUI alemã. A segunda coluna é do tamanho descompactado, a terceira coluna é o algoritmo de compactação e a quarta coluna é do tamanho compactado.

insira a descrição da imagem aqui

Como você pode ver, a codificação deflacionada do PNG economizou apenas 0,3%, enquanto o BMP codificado pela deflação é reduzido para um décimo do arquivo original, que é ainda menor que a versão PNG. Isso me surpreendeu bastante. Eu esperava que o PNG fosse menor porque o método de compactação do PNG deve ser otimizado para dados de imagem, enquanto o ZIP não é. Uma explicação provável é que meu editor de imagens (GIMP) adicionou muitas metainformações aos arquivos PNG, o que não é feito para o BMP.

O TGA descompactado se comportou de maneira semelhante ao BMP em relação ao tamanho do arquivo antes e depois do zíper, enquanto a compactação do arquivo TGA compactado foi aprimorada ainda mais pelo ZIP, embora não tanto quanto as versões descompactadas.

Pode valer a pena experimentar com outros algoritmos que não desinflar e com outras configurações de força de compressão. Qual combinação terá os melhores resultados provavelmente dependerá do estilo de suas texturas. Mas você também pode avaliar o carregamento de ativos do seu jogo e fazer com que o desempenho da descompressão influencie sua decisão sobre qual configuração você usa.

Conclusão: quando você deseja evitar a compactação dupla e ainda ter um tamanho de arquivo baixo, use PNGcom o Storealgoritmo zip ou BMPcom um algoritmo zip de compactação.

Philipp
fonte
5
Fiz isso em algumas fotos minhas e o PNG (nível de compressão 9) bateu o zip (nível de compressão ultra) das imagens BMP o tempo todo em cerca de 20%. Portanto, deve ser um efeito como meta-informação.
Trilarion
3
O png tem uma opção de entrelaçamento com diminuição da compressibilidade, mas permite que uma imagem de baixa resolução seja extraída apenas da primeira parte do arquivo de imagem (como ao fazer o download em uma conexão de baixa largura de banda), sua parede estava ativa? além disso, o png já usa o deflate para sua compactação.
catraca aberração
Parece que você usou um compressor png ruim, execute seus arquivos no PNGOUT e deverá obter um resultado que não será superado por um arquivo bmp compactado.
Aaaaaaaaaaaa 27/05
Seus BMPs ou TGAs são de 24 ou 32 bits? Com o BMP em particular, é mais provável que sejam de 24 bits, e o tamanho descompactado do TGA sugere que também é de 24 bits. Você provavelmente não está comparando igual-com-igual aqui.
Maximus Minimus
@ JimmyShelter Tanto o TGA quanto o BMP são 32 bits com canal alfa - eu tive certeza.
Philipp
7

Não se preocupe com isso.

Quando o algoritmo "desinflar" usado nos arquivos .zip encontra um bloco de dados que já está bem compactado, como os dados de pixel de uma imagem .png, ele descobre que não pode compactá-lo efetivamente e o armazena como literal dados não compactados. Isso leva muito pouca sobrecarga no final da descompressão para copiar.

http://en.wikipedia.org/wiki/DEFLATE

Russell Borogove
fonte
3
Às vezes é simples assim, um problema percebido não é necessariamente um problema real. Mesmo que houvesse a sobrecarga de descomprimir duas vezes, descompactar a desinfecção é uma operação muito rápida, acho que a sobrecarga seria apenas mensurável.
Aaaaaaaaaaaa 27/05
O fim da compactação levaria muito tempo para perceber que o arquivo não é compactável?
User253751
Relativamente sim. Não sei quais heurísticas típicas dos compressores .zip usam para escolher a codificação de um bloco, mas pode ser tão simples quanto tentar todas as codificações e manter o melhor resultado. Durante o desenvolvimento, se você precisar ter seus dados em um .zip, provavelmente desejará forçar tudo a usar, em storevez de deflateeconomizar tempo, deflatetudo para compilar a versão.
Russell Borogove
2

Parece que já foram dadas respostas muito boas, mas pensei em dar mais uma:

What are the solutions to this double compression problem?

Solução: Não faça nada.

Fundamentação da petição: Não há nenhum problema declarado - sim, você está compactando as informações duas vezes, mas por que está preocupado com isso? O tamanho dos dados é muito grande? A descompressão é muito lenta? Isso é mais ou menos importante do que as dezenas de recursos que você pode adicionar, refinar, testar e / ou depurar neste momento?

NPSF3000
fonte
Fazer algo duas vezes desnecessariamente é um problema em si. Pelo menos eu percebi isso como tal. Mas, é claro, você também está certo com sua sugestão. Tanto a memória quanto a velocidade de descompressão podem ser um problema, embora não neste caso, pois não estou escrevendo um jogo comercial.
User1095108
Sou desenvolvedor de jogos profissional e posso garantir, a menos que haja problemas reais e documentados de desempenho que não desperdiçaremos um segundo de preocupação com isso - são necessárias muitas compras ou impressões de anúncios de US $ 0,99 para pagar, digamos, 8 horas para 'corrigir' corretamente esse problema. Fazer algo duas vezes não é um problema, embora possa ser ineficiente. Embora, neste caso, você não esteja fazendo a mesma coisa duas vezes - você tem dados de imagem que estão sendo armazenados como PNG para compactação e um monte de arquivos que estão sendo arquivados juntos.
NPSF3000 28/05
É verdade, mas uma vez feito, é feito para vários projetos. Se você refletir sobre o algoritmo DEFLATE - ele permanece o mesmo desde os anos oitenta. Você seria um velho avô, se programou então, mas, se conhecesse o algoritmo, poderia, por exemplo, implementá-lo na GPU e desfrutar de velocidades de descompressão super-rápidas em vários projetos.
User1095108
Então você gasta duas semanas por mês implementando o Deflate na GPU? E então você percebe que está prestes a implantar na plataforma X do que Y e quebra seu algoritmo via Z. Se você quiser criar jogos, FOCO EM FAZER JOGOS, não se preocupe com coisas desnecessárias, como diminuir o desempenho.
NPSF3000
Depois de conhecer (re) implementar um algoritmo, deve ser fácil. Um piscar de olhos, não duas semanas ou um mês. Era o que eu queria dizer. Existe desde os anos 80, investir algum tempo nisso pode valer a pena.
User1095108
1

Se você usar formatos especializados, como PNG e OGG, não precisará da compactação do ZIP.

PNG, OGG e outros formatos já compactados não ficarão muito menores compactando-os novamente como ZIP. 100 MB de PNG compactados ainda são ~ 100 MB.

Scripts, arquivos de configuração e outros formatos baseados em texto se beneficiam muito da compactação; no entanto, geralmente são pequenos em comparação, não armazenam muitos dados. Se o seu jogo é de 100 MB, os arquivos de texto podem gerar 1 MB de todo o jogo, mesmo que você possa torná-los 100 KB por compressão, você só ganhou 900 KB, menos de 1%, dificilmente vale o esforço.

Você pode até querer usar o sistema de arquivos diretamente, em vez de usar um sistema de arquivos virtual baseado em zip. Isso tornaria o patch muito fácil: você pode trocar os arquivos modificados.

API-Beast
fonte
2
Às vezes, não é possível escolher se é para usar .zipou não um arquivo. Por exemplo, na plataforma Android, .apké um .ziparquivo que pode conter recursos.
User1095108
3
Além disso, há vantagens definidas no uso de um arquivo morto , e os arquivos ZIP fornecem compressão e uma estrutura de arquivo morto.
MrCranky
Sim, eu sei, só estou dizendo que usar o sistema de arquivos nativo também tem vantagens. Sou um pouco defensor do "mantenha as coisas simples".
API-Beast