Memória e desempenho de renderização
12 de março de 2026 ·Versão 0.3.4
O Fog Panther v0.3.4 traz um conjunto de otimizações internas que reduzem drasticamente o consumo de memória e melhoram o desempenho de renderização, sobretudo em documentos grandes e sessões de edição longas.
Histórico de anulações comprimido
O sistema de anulação guarda agora os instantâneos dos mosaicos como dados comprimidos com zstd, em vez de cópias completas não comprimidas. Cada pincelada, preenchimento ou aplicação de filtro que antes guardava buffers de mosaico em bruto de 16 KB comprime-os agora no momento da captura com zstd de nível 1, que funciona a cerca de 500 MB/s.
O resultado: 3 a 10 vezes menos memória por passo de anulação, consoante o conteúdo do mosaico. O orçamento fixo de 256 MB para anulações, que antes comportava cerca de 80 pinceladas significativas, comporta agora, na prática, 250 a 800. Anular e refazer continuam instantâneos - descomprimir um mosaico demora cerca de 11 microssegundos.
O formato FOG em disco já utilizava compressão zstd, pelo que os ficheiros guardados não mudam. Só a representação em memória é afetada.
Cache das superfícies de apresentação
Os formatos de píxel que não são RGBA8 - RGBA16, CMYKA, tons de cinzento - exigem uma conversão de formato para produzir a superfície Cairo ARGB32 usada na apresentação no ecrã. Antes, esta conversão era executada em cada mosaico visível, em cada fotograma.
Os mosaicos guardam agora em cache a sua superfície de apresentação após a primeira conversão. A cache é invalidada automaticamente sempre que os dados do mosaico mudam. Num documento de 16 bits com 200 mosaicos visíveis, isto elimina 200 conversões de formato por fotograma durante o deslocamento e o zoom.
Redução proativa da cache de mosaicos
A cache de mosaicos esperava até exceder o seu limite de memória para remover entradas, o que causava breves excessos de memória. Agora começa a reduzir aos 90% da capacidade e desce até aos 85%, criando uma banda de histerese que evita remoções repetidas na inserção seguinte.
Cache do padrão xadrez
O padrão xadrez da transparência - desenhado por trás de cada documento em cada fotograma - era antes criado e destruído em cada passagem de renderização. Agora é criado uma vez e reutilizado durante toda a vida do processo.
Correções de erros
Esta versão inclui também várias correções detetadas durante a revisão do trabalho de otimização:
- A cache de apresentação é agora invalidada corretamente por todas as funções que escrevem píxeis, e não apenas pelo acessor de dados em bruto
- A serialização do histórico já não escreve uma sequência de bytes de sinalização malformada quando um mosaico comprimido é descomprimido para vazio
- Refazer operações de apagamento restaura agora corretamente os mosaicos vazios
- A contabilização de memória da cache de mosaicos está agora correta ao substituir um mosaico em cache por outro com um formato de píxel diferente
- A inicialização do padrão xadrez é agora segura para threads