Skip to main content
Go to Editor

Documentação

Learn how to optimize your Spine 2D animations, reduce file size, and improve performance

FPSUIYouTubeanimationcom perdasconceitosconectorescontrolosdadosdesempenhoestatísticasexemplosexportfluxo de trabalhofluxosgráficosguiaguideinicianteligaçõesmaismemóriamétricasotimizaçãoplaybackpremium+preçosrecorderrecordingresultadossem perdassubscriçãotabelatimelinetiposvideoviewervisualizadorvídeo

Introdução: fluxo de trabalho básico

iniciantefluxo de trabalhoguia

Este guia ajuda-o a começar rapidamente com o JSON Optimizer.

  1. Carregar projeto: Use o InputNode para carregar os seus ficheiros .json, .atlas e .png.
  2. Escolher um preset (modo Plus): No modo Plus, use o painel da direita para selecionar um dos presets integrados (por exemplo, "Basic Fallback"). Isto constrói automaticamente um grafo de otimização para si. No modo Free, construa um grafo manual mínimo: InputNodeQuantizerNodeOutputNode.
  3. Executar o grafo: Clique no botão "Executar grafo".
  4. Comparar resultados: Mude para o separador "Visualizador" para comparar visualmente as animações original e otimizada.
  5. Rever alterações: Nos separadores "Resultados" e "Estatísticas", encontrará informação detalhada sobre quais as chaves que foram modificadas ou apagadas.

Tipos de socket e fluxo de dados

conectorestiposdadosligações

Este artigo explica os tipos de dados usados pelos sockets no grafo de nós e o que pode ser ligado a quê.

Regra rápida

A maioria dos nós de processamento trabalha com uma carga do Spine. Os nós relacionados com atlas trabalham com um projeto de atlas ou com sprites. Use o ValidatorNode quando não tiver a certeza do que um socket espera.

Tipos de socket

  • Carga do Spine — representação do projeto Spine amigável para tempo de execução, usada pela maioria dos nós de processamento.
  • Projeto de atlas — metadados do atlas + imagens das páginas, usados por nós de atlas.
  • Sprites — imagens/regiões de sprites desempacotadas (Atlas Unpacker → visualizador de recursos / Atlas Repacker).
  • JSON — JSON Spine original ou reconstruído para diagnóstico/validação/comparação.
  • Alterações — lista/fluxo de diferenças produzidas por alguns otimizadores e usadas por nós de visualização/relatórios.

Chave → tipo → ligar a

Chave do socket (exemplos)Tipo de dadoProduzido porLigar a
payload, payload_in, payload_outCarga do SpineInputNode, maioria dos nós de processamentoNós de processamento (RDP/Spline/Refit/Quantizer/Cleanup/etc.), depois OutputNode.payload
original_jsonJSONInputNodeDiagnosticNode, JSONDiffNode.json_before, OutputNode.original_json, alguns nós de atlas (p. ex., modo alpha do repacker)
reconstructed_json_outJSONOutputNodeJSONDiffNode.json_after, validadores/depuração
changesLista de alteraçõesAlguns nós + OutputNodeAnimationViewerNode (opcional), relatórios/depuração
atlas_projectProjeto de atlasInputNode / visualizador de atlasAtlasUnpackerNode.atlas_project, OutputNode.atlas_project, filtros de atlas
atlas_in, atlas_outProjeto de atlas (ou fluxo relacionado com atlas)Nós/filtros de atlasNós de atlas, AtlasViewerNode, AtlasMergerNode (via multi-entrada)
sprites_out, sprites_in, sprites_data_inSpritesAtlasUnpackerNode, filtrosAssetViewerNode.sprites_in, AtlasRepackerNode.sprites_data_in
atlas_inputsVários projetos de atlasVárias fontesAtlasMergerNode.atlas_inputs (ligue vários atlas)

Fluxos práticos

  • Otimização básica de JSON: InputNode → (opcional: DiagnosticNode / filtros) → otimizadores (RDPNode, SplineNode, QuantizerNode, …) → OutputNode.
  • Reempacotamento de atlas: InputNode.atlas_projectAtlasUnpackerNode → (opcional: AssetViewerNode) → AtlasRepackerNodeOutputNode.atlas_project/atlas_assets.

Planos de subscrição e funcionalidades Premium

subscriçãopremium+maispreços

O re-polish oferece dois níveis de subscrição para diferentes necessidades.

Plano Gratuito

  • ✓ Grafo de nós básico
  • ✓ Visualizador JSON
  • ✓ Linha de tempo para reproduzir animações em várias faixas com mistura ajustável entre animações
  • ✓ Otimizações limitadas
  • ✓ Versões do Spine: 4.2, 4.1, 4.0, 3.8, 3.7

Plano Plus ($5/mês)

  • ✓ Todas as funcionalidades do plano Gratuito
  • ✓ Ferramentas de otimização para keyframes, curvas e texturas
  • ✓ Converter física em keyframes
  • ✓ Limpar keyframes convertidos para curvas
  • ✓ Predefinições do grafo
  • ✓ Suporte prioritário

Obter o Plus

Clique no botão Upgrade na navegação superior e depois:

  • Selecione Get Plus
  • Será redirecionado para o Patreon — conclua a subscrição
  • Volte ao editor de nós com sessão iniciada na mesma conta Patreon para que o serviço verifique a ligação e ative o Plus
  • (Opcional) Introduza um código de ativação (para ofertas especiais)

Conceitos fundamentais: com perda vs. sem perda

conceitoscom perdassem perdasiniciante

Os métodos de otimização dividem-se em dois tipos principais:

Recomendação: comece sempre pelas otimizações sem perda. Use métodos com perda apenas quando precisar de reduzir ainda mais o tamanho do ficheiro e valide o resultado visualmente.

Como medir a eficácia

guiamétricasestatísticas

Para compreender a eficácia da sua otimização, preste atenção às seguintes métricas:

  • Tamanho do ficheiro: O tamanho final do ficheiro .json é o principal objetivo da otimização.
  • Contagem de keyframes: No separador "Estatísticas", encontrará tabelas e gráficos que mostram quantos keyframes foram removidos em cada animação.
  • Comparação visual: Utilize sempre o separador "Viewer" para comparar as animações "antes" e "depois". Garanta que as otimizações com perda não introduziram artefactos visuais inaceitáveis.
  • Relatório na tabela "Resultados": Aqui pode examinar em detalhe cada alteração específica feita aos seus dados.

Visualizador: painel de controlos

visualizadorcontrolosUI

O separador Visualizador sobrepõe um painel de Controlos em cima da tela. Está dividido em três grupos:

Controlos de animação

  • Animação — seleciona qual animação Spine está a ser reproduzida.
  • Aparência — seleciona qual aparência é aplicada.
  • Velocidade — multiplicador da velocidade de reprodução (0.1× → 3.0×).

Controlos de vista

  • Repor vista — repõe a posição padrão da câmara/layout.
  • Opções de vista — offsets numéricos usados para posicionar a vista de comparação: Espaçamento X / Espaçamento Y (distância entre original/otimizado) e Offset X / Offset Y (deslocamento global).

Controlos de depuração

  • Modo de depuração — ativa sobreposições de renderização de depuração (depende do suporte em tempo de execução).
  • Ativar física — alterna a simulação de física (se o esqueleto usar física).
  • Etiquetas — alterna a sobreposição de etiquetas.

Visualizador: painel de desempenho

desempenhoFPSmemóriaUI

O painel Performance mostra métricas de runtime em tempo real para o(s) skeleton(s) atualmente em reprodução.

Tempo real

  • FPS — frames por segundo medidos pelo monitor.
  • Frame Time — tempo por frame em milissegundos (quanto menor, melhor).
  • FPS chart — as últimas 120 amostras apresentadas como barras.

Métricas do skeleton

  • Visible Slots — quantos slots estavam visíveis na última amostra.
  • Avg. Visible — média móvel de slots visíveis (mais estável do que um único frame).
  • Vertices — contagem atual de vértices usada para renderização.
  • Bounds (px) — limites atuais do skeleton (largura×altura) em píxeis.
  • Avg. Bounds — média móvel dos limites.
  • Largest Texture — a maior página do atlas (por dimensões) detetada para o skeleton.
  • Texture Memory — memória total estimada de texturas para as páginas do atlas carregadas. Quando disponível, o painel também mostra um detalhamento por página (nome do ficheiro, dimensões e tamanho estimado).

Melhorias (quando Optimized está disponível)

  • Slot Improvement — compara Avg. Visible entre Original e Optimized.
  • Memory Change — compara Texture Memory entre Original e Optimized.

Visualizador: Linha temporal

viewertimelineanimationplaybackguide

O painel Linha temporal é um sequenciador de animação ancorável na parte inferior do Visualizador. Permite organizar clipes de animação em múltiplas faixas, controlar a reprodução e pré-visualizar transições.

Faixas e clipes

  • Até 4 faixas de animação — cada faixa corresponde a uma camada trackIndex do Spine. Faixas superiores misturam-se sobre as inferiores.
  • Adicionar animação — clique no botão + em qualquer faixa para abrir o seletor de animações (com filtro de pesquisa).
  • Arrastar e redimensionar clipes — arraste o corpo do clipe para o mover ao longo da faixa; arraste as extremidades esquerda/direita para alterar o tempo de início ou a duração.
  • Eliminar clipes — selecione um clipe e prima Delete ou Backspace.
  • Deteção de sobreposição — clipes sobrepostos na mesma faixa são realçados a vermelho.

Controlos de transporte

  • Reproduzir / Pausar / Parar — controlos de reprodução padrão.
  • Anterior / Seguinte — saltar para o início do clipe anterior ou seguinte.
  • Velocidade da animação — controlo deslizante de 0.1× a 3.0×.
  • Paragem automática — a reprodução para automaticamente no final da linha temporal.

Mistura de transições

  • Duração global de mistura — define o tempo de crossfade predefinido entre clipes consecutivos.
  • Substituições por transição — clique na bolha de transição entre dois clipes para definir uma duração de mistura personalizada. Pode repor substituições individuais para o valor global.

Busca e scrubbing

  • Indicador de reprodução — arraste a pega na régua de tempo ou clique na régua para saltar.
  • Pré-visualização do tempo do cursor — ao passar sobre a área da faixa, é mostrado o tempo sob o cursor.
  • Web Worker — o cálculo de busca e eventos é transferido para um worker em segundo plano para um desempenho mais suave.

Reprodução com física

  • Alterne a física entre Update (restrições ativas) e None (desativado).
  • Durante a busca, o tempo do esqueleto é avançado para resolver corretamente as restrições de física.

Suporte multi-esqueleto

  • Seletor de par alvo — cada faixa pode apontar para todos os pares (🌐 Todos os pares) ou para um esqueleto específico.
  • Posição e escala por esqueleto — entradas de offset X/Y e escala para esqueletos individuais.
  • Ordem de desenho — entrada numérica para controlar a prioridade da camada de renderização.

Debug Draw

Alternar visibilidade para: Bones, Bone Names, Regions, Meshes, Hulls, Bounds, Paths, Clipping, Points.

Seleção de skin

Caixas de seleção múltipla para todas as skins definidas no esqueleto carregado.

Definições de vista

  • Spacing X / Y — espaçamento entre pares de esqueletos.
  • Offset X / Y — deslocamento global da viewport.
  • PMA — modo de alpha pré-multiplicado (Spine 3.x) ou modo alfa do atlas (Spine 4.x: auto / pma / bleed / none).
  • Etiquetas de esqueleto — alternar sobreposição de etiquetas.

Visualizador: Gravador

viewerrecorderrecordingexportvideoguide

O Gravador captura animações Spine do visualizador como vídeo, imagens animadas ou sequências de imagens.

Modos de gravação

  • ⚡ Gravação rápida — captura em tempo real usando MediaRecorder + captureStream(). Produz apenas WebM. Rápido mas limitado à taxa de fotogramas em tempo real.
  • 🎬 Exportação HQ — renderização offline fotograma a fotograma usando WebCodecs VideoEncoder + readPixels(). Suporta todos os formatos e produz saída com qualidade perfeita ao nível do pixel.

Formatos de saída

  • Vídeo: WebM, MP4, AVI, MOV
  • Imagem animada: GIF, Animated PNG (APNG)
  • Sequência de imagens: PNG Sequence, WebP Sequence

Codecs (Exportação HQ)

VP8, VP9, H.264 (AVC), AV1, ProRes — os codecs disponíveis são auto-detetados com base no suporte do navegador.

Qualidade

  • Presets: Baixa (~1 Mbps), Média (~3 Mbps), Alta (~5 Mbps), Sem perda (~20 Mbps).
  • Bitrate personalizado — especifique em kbps para controlo fino.

Temporização

  • FPS: 24, 30, 60 ou personalizado (1–120 fps).
  • Aquecimento — segundos para estabilização de física/restrições antes do início da gravação.
  • Pausa após — mantém o último fotograma durante um tempo definido.
  • Incluir último fotograma — alternador.

Viewport e recorte

  • Ativar/desativar recorte — alternador da região de recorte.
  • Retângulo de recorte — X, Y, Largura, Altura em coordenadas do mundo Spine.
  • Ajustar ao par — ajuste automático do recorte a um par de esqueletos com preenchimento configurável.
  • Sobreposição interativa de recorte — arraste cantos/arestas diretamente na viewport.

Resolução

  • Modo de escala — controlo deslizante percentual (10%–400%).
  • Modo fixo — dimensões explícitas em píxeis (até 4096px).
  • Resolução de saída calculada apresentada em tempo real.

Opções de renderização

  • Renderizar bones — incluir sobreposição de depuração de bones.
  • Renderizar imagens — incluir imagens de attachments.
  • Renderizar outros — bounding boxes, caminhos.
  • MSAA — Nenhum / 2× / 4× anti-aliasing.
  • Suavização — níveis 0–8 com escolha de algoritmo (Bicúbico / Bilinear).

Fundo

  • Transparente — auto-desativado para formatos sem canal alfa (por exemplo, GIF, JPEG).
  • Cor sólida — seletor de cor personalizado.
  • Xadrez — indicador visual de transparência.
  • Suporte de canal alfa: VP9+WebM, AV1+MP4, PNG Sequence, APNG, WebP Sequence.

Sobreposição HUD

  • Alternadores: info da faixa, tempo, número de fotograma, FPS, etiquetas de esqueleto.
  • Texto personalizado — string de marca de água.
  • Posição — 4 cantos (superior-esquerdo, superior-direito, inferior-esquerdo, inferior-direito).
  • Tamanho da fonte — 8–64px, mais seletor de cor do texto.

Repetição e multi-esqueleto

  • Contagem de repetições — 1–100 iterações de loop.
  • Par alvo — gravar um esqueleto específico ou todos.
  • Modo de esqueletos — Combinado (ficheiro único) / Ficheiros separados (um ficheiro por esqueleto).

Modelo de nome de ficheiro

String de modelo com variáveis: {project}, {animation}, {W}, {H}, {fps}. Uma pré-visualização em tempo real do nome de ficheiro resolvido é apresentada.

Integração com a linha temporal

O intervalo de gravação aparece como um clipe tracejado vermelho/laranja na linha temporal. Arraste as extremidades para redimensionar o intervalo, arraste o corpo para reposicionar, ou use o botão de definições (⚙️) para abrir as definições completas de gravação.

Separador Resultados

resultadostabelaotimização

O separador Resultados mostra a saída detalhada da otimização.

  • Tabela de resultados — uma vista com uma linha por alteração dos resultados de otimização do JSON (por exemplo, que animação/osso/propriedade/fotograma‑chave foi modificado ou removido).
  • Comparação de sprites/atlas — quando a otimização de texturas é utilizada, esta secção compara tamanhos de sprites e resultados do empacotamento.

Dica: use a vista de Resultados para responder: o que mudou exatamente?

Separador Estatísticas

estatísticasgráficosmétricas

O separador Estatísticas resume os resultados da otimização através de gráficos e métricas agregadas.

  • Gráfico de otimização — visualiza o impacto da otimização no conjunto de dados (quando as otimizações de JSON produziram alterações).
  • Tabela de métricas — números-chave como tamanhos original/novo e percentagem de redução.
  • Estatísticas de empacotamento de texturas — se o reempacotamento de atlas foi usado, mostra páginas, área total/usada, eficiência e uma discriminação por página.

Use este separador para responder: quanto melhorámos no geral?

Exemplos de pipelines (Vídeo)

vídeoexemplosfluxosYouTube

Abaixo estão fluxos completos e reais da playlist oficial do YouTube.

Abrir a playlist completa

Exemplos

Experiências Spine2D 1: otimização de curvas com algoritmo RDP — demonstração base de otimização Spine 2D: o algoritmo Ramer–Douglas–Peucker (RDP) remove dados redundantes de curvas e chaves para reduzir o JSON. O RDP pode remover chaves importantes, por isso reveja sempre as animações e exclua ossos/slots sensíveis com nós de filtro antes do nó RDP. Ver no YouTube

Experiências Spine2D 2: otimização de curvas com algoritmo de quantização — a quantização é o otimizador de curvas mais seguro: arredondar valores (muitas vezes para 1 decimal) dá ganhos imediatos de tamanho. Exemplo: [0.115,14.5,0.222,-27.78] → [0.1,14.5,0.2,-27.8]. Use o nó de quantização como último passo antes do nó de saída para fixar a otimização; o vídeo mostra antes/depois com mudança visual quase impercetível. Ver no YouTube

Experiências Spine2D 3: reconstrução de curvas com Spline e Refit — Spline é sem perda para segmentos retos (remove chaves intermédias redundantes), enquanto Refit é com perda mas poderoso: reconstrói secções complexas como uma única curva Bézier. Estes algoritmos são ideais após bake de física e limpeza via o nó Schneider. Nota: iterações de Refit acima de 100 podem demorar minutos a encontrar a melhor curva. O vídeo mostra como ambos os métodos funcionam e a percentagem de otimização obtida. Ver no YouTube

Experiências Spine2D 4: remoção de dados redundantes com nós de visibilidade de anexos e limpeza — otimização estrutural Spine 2D com nós de visibilidade de anexos e limpeza. A visibilidade de anexos desativa anexos quando o alfa desce a 0 e restaura-os na transição suave, reduzindo chamadas de desenho e chaves redundantes. A limpeza remove redundâncias lógicas: faixas de cor/alfa não usadas, chaves de rotação IK totalmente controladas por restrições e chaves de restrições de caminho. O vídeo mostra como estas otimizações lógicas diferem da simplificação de curvas. Ver no YouTube

Experiências Spine2D 5: construção de pipelines não lineares (filtros e nó de união) — otimização não linear: divide o fluxo de dados com filtros (animação, osso, slot, parâmetro ou aparência), executa algoritmos diferentes em ramos paralelos (por exemplo, compressão agressiva para ossos do corpo mantendo a animação facial sem perda) e depois combina os ramos com um nó de união num único esqueleto. Este fluxo vai além de um simples Entrada → Otimização → Saída e permite otimizar apenas o que deve ser otimizado. Ver no YouTube

Experiências Spine2D 6: reempacotamento de texturas e escalonamento seletivo — fluxos avançados de otimização de texturas: os nós de desempacotamento e reempacotamento de atlas permitem desempacotar, redimensionar e reempacotar atlas dentro de um único grafo, mais rápido do que o fluxo de trabalho padrão do Spine. Usando um fluxo não linear, pode dividir recursos, manter texturas de personagem a 100% e reduzir outras para 25%, depois fundir tudo num atlas partilhado. O visualizador de atlas e recursos fornece inspeção visual e filtragem em cada etapa. Isto facilita definir alvos de redimensionamento, processar seletivamente e recombinar resultados como um modelo reutilizável. Ver no YouTube

Experiências Spine2D 7: redimensionamento instantâneo do esqueleto com nó de escala — fluxo de ponta a ponta de otimização Spine 2D com escalonamento do esqueleto. O nó de escala substitui um fluxo de trabalho Spine trabalhoso (exportar/importar, reempacotar/desempacotar, corrigir caminhos) por um único passo no grafo: definir o tamanho alvo, pré-visualizar instantaneamente na janela de visualização e iterar em tempo real. O vídeo liga a otimização de curvas e chaves, o processamento de recursos e o redimensionamento do esqueleto num só fluxo. Ver no YouTube

Experiências Spine2D 8: visão geral dos nós da beta pública — visita guiada a todos os nós disponíveis na beta pública e como o re‑polish faz a ponte entre as necessidades de animadores e programadores. Inclui limpeza de chaves redundantes, simplificação Bézier→linear, arredondamento para reduzir tamanho, remoção de anexos invisíveis, limpeza de propriedades não usadas, deteção de caracteres não ingleses e atlas desempacotar/filtrar/escalar/reempacotar. O visualizador duplo valida com comparação visual e FPS lado a lado. A beta pública está ativa em re-polish.com. Ver no YouTube

Experiências Spine2D 9: bake de restrições de física em keyframes — neste vídeo, demonstro as minhas experiências mais recentes a fazer bake de restrições de física em keyframes padrão. O novo algoritmo de bake garante: loops perfeitos (zero jitter ou saltos entre o início e o fim), tamanho de ficheiro otimizado (a limpeza automática de curvas mantém o tamanho do JSON próximo do original) e compatibilidade retroativa (chaves bakeadas permitem usar animações de física do Spine 4.2 no Spine 4.1 ou mesmo 4.0). Ver no YouTube

Nodes

Input

Importa ficheiros de projeto Spine, entradas apenas JSON, recursos de demonstração e pacotes ZIP para o grafo.

Objetivo: Este e o principal ponto de entrada para a maioria dos fluxos de trabalho. Le JSON, atlas e texturas e normaliza-os para dados internos que os nos a jusante conseguem processar.

Modos suportados:
1. Projeto completo: JSON + atlas + texturas
2. Apenas JSON: processa dados de esqueleto/animacao sem atlas
3. Pacote ZIP: um ficheiro zip empacotado que contem um projeto completo
4. Recursos de demonstracao: dados de exemplo incorporados para testes rapidos

Saidas principais:
- **payload_out**: dados normalizados para nos de otimizacao
- **original_json_out**: JSON de origem para comparacao ou reconstrucao
- **atlas_project_out**: projeto de atlas analisado quando sao fornecidas texturas

Picture Input

Adiciona imagens PNG/JPEG independentes a viewport para que possa criar pre-visualizacoes e capturas de apresentacao mais limpas.

Objetivo: Use este no para colocar imagens diretamente na viewport como camadas de apresentacao ou auxiliares visuais. E util quando pretende decorar uma cena, adicionar graficos de apoio e tornar as pre-visualizacoes do projeto mais polidas antes de gravar videos ou demos.

Fluxo de trabalho: Carregue uma imagem e, em seguida, use as ferramentas da viewport para a dimensionar, mover e ajustar o respetivo z-index para que fique corretamente posicionada na composicao. Isto e conveniente para criar capturas de apresentacao apelativas sem tocar nos dados principais do projeto Spine.

Este no e autonomo e nao expoe sockets do grafo.

Output

Recolhe os resultados finais e permite descarregar dados otimizados como ficheiros separados, conjuntos de ficheiros agrupados ou arquivos.

Objetivo: Atua como o centro de exportacao para JSON otimizado, dados de atlas, texturas e sprites. Pode montar resultados a partir de um unico conjunto JSON/atlas/texturas, de varios conjuntos de ficheiros ou apenas de sprites quando pretende saida de imagem sem reconstruir um projeto Spine completo.

Opcoes de exportacao:
- Descarregar ficheiros individualmente ou como um unico arquivo
- Descarregar resultados empacotados ou um arquivo com ficheiros descompactados
- Exportar JSON em formato compacto ou num formato legivel com pretty print
- Exportar dados completos do projeto Spine ou apenas resultados de sprite/imagem

Fluxo de encadeamento: O OutputNode nao tem de ser o fim absoluto do grafo. Pode passar as suas saidas para outra fase do pipeline e executar os mesmos ficheiros atraves de passes adicionais de otimizacao. Na pratica, a otimizacao de chaves e curvas foi testada ate 3 iteracoes consecutivas.

Saidas principais:
- **reconstructed_json_out**: JSON Spine reconstruido
- **original_json_passthrough_out**: passagem direta do JSON original
- **payload_out**: payload para encadeamento adicional
- **changes**: alteracoes de otimizacao recolhidas
- **atlas_assets**: recursos de atlas prontos para exportacao

RDP

Simplifica curvas de animação (RDP).

Objetivo: Reduz o número de keyframes em segmentos de animação lineares ou quase lineares removendo pontos que estão numa linha reta entre outros dois.

Regra de Ouro: Desativada por predefinição. Protege curvas com forma significativa (área/curvatura) contra linearização. Desative apenas para compressão mais agressiva após revisão visual.

Chaves de socket: payload_in, payload_out, changes

Spline

Otimização de curvas com splines.

Objetivo: Ajuste suave de curvas mantendo a qualidade visual.

Chaves de socket: payload_in, payload_out, changes

Refit

Refit de curvas (Bezier) para reduzir keyframes.

Objetivo: Ajusta menos curvas mantendo-se dentro de uma tolerância.

Chaves de socket: payload_in, payload_out, changes

Quantizer

Reduz a precisão de valores numéricos em keyframes e curvas.

Objetivo: forma simples mas eficaz de reduzir o tamanho do ficheiro ao arredondar números para um número específico de casas decimais.

Utilização: pode ser aplicado a quase todos os dados de animação. Torna-se mais eficaz com contagens de keyframes mais elevadas.

Atenção: uma quantização demasiado agressiva (baixa precisão) pode causar jitter ou artefactos visuais nas animações.

Cleanup

Executa várias tarefas de limpeza para remover dados de animação redundantes ou desnecessários.

Objetivo: ferramenta especializada para remover tipos específicos de dados redundantes que outros otimizadores podem não detetar.

Utilização: ligue o seu payload a 'payload_in' e use o resultado de 'payload_out'. Se quiser um relatório por alteração, use também 'changes'.

Chaves de socket:
- Entradas: payload_in
- Saídas: payload_out, changes

Limpezas atualmente suportadas:
1. **Remover tracks de cor/alpha não usados**: remove timelines de cor/alpha para slots que nunca ficam visíveis durante a animação.
2. **Remover rotações IK redundantes**: remove keyframes de rotação de bones totalmente controlados por uma constraint IK com mix a 100%.
3. **Remover keys de Path Constraint**: remove keyframes de rotate/translate de bones totalmente controlados por uma path constraint (mix a 100%).
4. **Sanitizar caracteres não ingleses**: substitui caracteres não ingleses em nomes/identificadores para evitar problemas em ferramentas posteriores.

Scale

Escala todos os valores numéricos nos keyframes de animação por um fator especificado.

Objetivo: escala uniformemente os dados de animação, útil para redimensionar o skeleton proporcionalmente ou ajustar a intensidade da animação.

Utilização: ligue ao payload e defina o fator de escala. Valores acima de 1.0 aumentam; abaixo de 1.0 reduzem.

Parâmetros:
- **Scale Factor**: multiplicador aplicado a todos os valores de posição e tamanho.
- **Include Rotations**: se também deve escalar valores de rotação (normalmente desativado).

Casos de uso:
- Redimensionar animações importadas para corresponder a novas dimensões do skeleton
- Criar variantes exageradas ou subtis de animações
- Escalonar em lote várias animações para diferentes tamanhos de personagem

Schneider

Ajusta curvas Bézier suaves a keyframes de animação usando o algoritmo de ajuste de curvas Schneider.

Objetivo: ajuste avançado de curvas que produz curvas Bézier com aspeto natural a partir de sequências densas de keyframes.

Disponibilidade: **Somente nó Plus**.

Como funciona: o algoritmo Schneider analisa posições e tangentes dos keyframes para gerar pontos de controlo Bézier ótimos que correspondem de perto ao movimento original.

Parâmetros:
- **Error Tolerance**: desvio máximo permitido em relação aos keyframes originais. Menor = mais preciso; maior = curvas mais suaves.
- **Corner Angle**: limiar de ângulo (graus) a partir do qual a curva deve ser dividida em segmentos.

Melhor para:
- Animações desenhadas à mão ou importadas com muitos keyframes
- Converter interpolação linear em curvas Bézier suaves
- Reduzir a contagem de keyframes mantendo a qualidade da curva

Nota: mais intensivo computacionalmente do que algoritmos mais simples como RDP, mas produz qualidade de curva superior.

Physics Constraint Bake

Bake Physics Constraints to Keys: converte o movimento do PhysicsConstraint em keyframes de rotação/translação e remove timelines de física.

Objetivo: converte a simulação de física em tempo de execução em keyframes explícitos, tornando as animações determinísticas e editáveis sem PhysicsConstraints. Após o bake, remove PhysicsConstraints e timelines de física do payload.

Disponibilidade: **Somente nó Plus**.

Entradas/Saídas:
- **payload_in** → **payload_out** (baked)
- **changes** (lista opcional de alterações)

Controlos:
- **Sample FPS**: taxa de amostragem da simulação.
- **Bake Rotation**: grava keyframes de rotação.
- **Bake Translation**: grava keyframes de translação.
- **Bake Translation (Children)**: aplica o bake de translação aos ossos filhos que dependem do movimento físico.

Notas:
- Requer o Spine JSON original para reconstruir os dados de simulação.
- Use quando quiser remover PhysicsConstraints, mas manter o movimento.

Attachment Visibility

Otimiza a renderização ao definir o attachment de um slot como null quando o seu alpha é zero.

Objetivo: impede que o motor de jogo tenha de processar ou renderizar attachments invisíveis.

Utilização: analisa tracks de alpha/cor e adiciona ou modifica automaticamente keyframes no track 'attachment' correspondente.

Parâmetros:
- **Alpha Threshold**: valor de alpha abaixo do qual um attachment é considerado invisível.
- **Auto Restore**: se ativado, o nó repõe automaticamente o último attachment visível quando o alpha sobe acima do limiar.

Payload Merger

Combina vários payloads de animação processados de volta num único payload unificado.

Objetivo: essencial para pipelines de processamento em paralelo, onde diferentes animações ou grupos de bones são otimizados separadamente e precisam de ser recombinados.

Estratégia de merge:
1. **Entrada base**: fornece a estrutura do skeleton (bones, slots, skins, etc.)
2. **Entradas de override**: fornecem tracks processados que substituem os tracks da base
3. **Last Write Wins**: quando vários overrides fornecem o mesmo track, o último tem prioridade

Deteção de conflitos:
- Conflitos entre entradas de override são detetados e reportados
- Substituição Base → Override é comportamento normal (não é um conflito)
- Um toast de aviso é mostrado quando ocorrem conflitos de tracks

Exemplo de pipeline:
```
Input → AnimFilter('run') → Cleanup ───────┐
      → AnimFilter('idle') → Quantizer ────┤
      → (base) ────────────────────────────→ Merger → Output
```

Casos de uso:
- Otimizadores diferentes para animações diferentes
- Processamento separado de bones/slots com recombinação
- Testes A/B de diferentes estratégias de otimização

Animation Viewer

Ferramenta visual para inspecionar e comparar curvas de animação antes e depois da otimização.

Objetivo: fornece uma representação gráfica de keyframes e curvas para o track selecionado.

Utilização: ao ligar as entradas 'payload_before' e 'payload_after', sobrepõe as curvas original e otimizada, facilitando ver o impacto das suas otimizações.

Animation Filter

Filtra tracks de animação com base no nome da animação (por exemplo, 'run', 'idle').

Objetivo: útil para aplicar estratégias de otimização diferentes a animações diferentes.

Utilização: por exemplo, pode aplicar otimizações agressivas com perda (como DCT) a animações de personagens de fundo, enquanto usa otimizações sem perda (como Spline) para ações da personagem principal.

Asset Filter

Filtra assets de atlas por nome; funciona em dois modos: antes do unpacker (filtra texto do atlas) ou após o unpacker (filtra sprites).

Objetivo: controla quais os recursos incluídos no fluxo de trabalho — quais os recursos a desempacotar do atlas e quais os sprites desempacotados a incluir no reempacotamento.

Modos:
1. MODO PRÉ-DESEMPACOTADOR (antes do AtlasUnpacker):
   - Entrada: atlas_in (atlas_project)
   - Saída: atlas_out (atlas_project filtrado)
   - Fluxo: InputNode → AssetFilter → AtlasUnpacker
   - Caso de uso: filtrar quais os recursos a desempacotar do atlas (poupa tempo de processamento)

2. MODO PÓS-DESEMPACOTADOR (após o AtlasUnpacker):
   - Entrada: sprites_in (sprites)
   - Saída: sprites_out (sprites filtrados)
   - Fluxo: AtlasUnpacker → AssetFilter → AtlasRepacker
   - Caso de uso: filtrar quais os sprites desempacotados a incluir no atlas final

Comportamento da interface:
- No modo PRÉ-DESEMPACOTADOR: analisa o texto do atlas para descobrir nomes de recursos
- No modo PÓS-DESEMPACOTADOR: descobre nomes de recursos a partir do array de sprites
- Alternador 'Permitir tudo': quando ativado, deixa passar todos os recursos (a lista é mostrada mas desativada)
- Caixas de seleção: selecione recursos específicos para incluir (quando 'Permitir tudo' está desativado)

Exemplos:
- Pré-desempacotador: selecionar apenas recursos 'char_*' para desempacotar só sprites da personagem
- Pós-desempacotador: excluir sprites 'background_*' do atlas final reempacotado
- Criar um atlas só de armas selecionando o padrão 'weapon_*'

Bone Filter

Filtra tracks de animação de bones com base no nome da bone.

Objetivo: permite direcionar ou excluir bones específicas do processo de otimização.

Utilização: pode querer excluir bones sensíveis, como as usadas para expressões faciais, de uma otimização agressiva para preservar todos os detalhes, enquanto otimiza mais fortemente bones menos importantes.

Skin Filter

Filtra dados de animação e assets com base nos nomes das skins.

Objetivo: processar apenas skins específicas de um projeto Spine com múltiplas skins.

Utilização: quando um projeto Spine tem várias skins (por exemplo, 'default', 'armor', 'casual'), este nó permite filtrar quais as skins a incluir no processamento.

Parâmetros:
- **Skins List**: checkboxes para cada skin disponível
- **Allow All**: alternador para incluir todas as skins (padrão)

Casos de uso:
- Criar um atlas separado por skin
- Aplicar otimizações diferentes a skins diferentes
- Excluir skins raramente usadas do build otimizado

Nota: as skins partilham a estrutura do skeleton, mas podem ter attachments diferentes.

Slot Filter

Filtra tracks de animação de slots com base no nome do slot.

Objetivo: útil para direcionar ou excluir slots específicos que possam ter requisitos especiais de timing ou visibilidade.

Utilização: pode usar isto para excluir slots de armas ou efeitos que são trocados via código, evitando que sejam afetados por otimizações de visibilidade de attachments.

Parameter Filter

Filtra tracks de animação com base no tipo de propriedade (por exemplo, rotação, escala, cor).

Objetivo: permite aplicar otimizações subsequentes apenas a tipos específicos de dados de animação.

Utilização: coloque este nó antes de um otimizador para limitar o seu âmbito. Por exemplo, pode aplicar a otimização RDP apenas a tracks de 'translation' e 'scale'.

Atlas Unpacker

Extrai sprites individuais de um atlas de texturas Spine.

Objetivo: decompõe um ficheiro de atlas nos seus sprites componentes, permitindo análise individual ou reempacotamento.

Utilização: ligue a saída 'atlas_project' do InputNode à entrada 'atlas_project_in' deste nó. A saída pode então ser enviada para o AssetViewer para inspeção ou para o AtlasRepacker para otimização.

⭐ Corte por malha (Mesh Cropping): ligue a saída 'Original JSON' do InputNode à entrada 'Skeleton JSON' para ativar o corte automático dos sprites aos limites da sua malha (em vez de bounds retangulares). Isto reduz significativamente a utilização de memória de texturas para sprites com mesh attachments, removendo píxeis transparentes fora do contorno da malha.

Saídas:
- **sprites_out**: Array de sprites normalizado (para viewer/repacker)
- **sprites_data_out**: Imagens/metadados de sprites extraídos (bundle estruturado)
- **atlas_out**: Pass-through do projeto de atlas

Chaves de socket: atlas_project, atlas_project_in, skeleton_json_in, sprites_out, sprites_data_out, atlas_out

Atlas Repacker

Reempacota sprites individuais em um ou mais novos atlases de texturas otimizados.

Objetivo: este nó otimiza a memória de texturas e, quando possível, reduz chamadas de desenho ao criar folhas de imagens mais eficientes.

Utilização: recebe dados de imagens (normalmente do nó de desempacotamento de atlas) e cria uma nova disposição do atlas.

Parâmetros:
- **Tamanho máximo da textura**: largura/altura máximas das páginas de atlas de saída.
- **Preenchimento**: distância em píxeis entre imagens.
- **Escala**: redimensiona as imagens antes do empacotamento.
- **Potência de dois**: impõe dimensões de saída para potências de dois (por exemplo, 1024, 2048), exigido por algumas plataformas.
- **Permitir rotação**: permite rodar as imagens 90 graus para melhorar a eficiência do empacotamento.

Atlas Viewer

Ferramenta leve de visualização e análise de atlas para inspecionar a estrutura antes do unpacking.

Objetivo: fornece uma forma rápida de pré-visualizar páginas e regiões do atlas sem executar a operação pesada de unpacking. Ajuda a validar a estrutura do atlas e a identificar regiões não utilizadas.

Utilização: ligue a saída 'atlas_project' do InputNode à entrada 'atlas'. Opcionalmente, ligue 'original_json_out' à entrada 'json' para analisar o uso das regiões.

Funcionalidades:
- Pré-visualização das páginas do atlas com limites das regiões
- Realce de regiões: Verde = usada, Vermelho = não usada no skeleton
- Controlos de navegação entre páginas
- Estatísticas com total e regiões não utilizadas

Casos de uso:
- Validação rápida do atlas antes da otimização
- Identificar peso morto (regiões não utilizadas)
- Depurar problemas de packing do atlas
- Compreender a estrutura dos assets

Chaves de socket: atlas_project, atlas_in, atlas, json

Atlas Merger

Combina várias fontes de atlas num único atlas unificado.

Objetivo: fundir vários projetos de atlas num só.

Entrada:
- **atlas_inputs**: array multi-entrada de projetos de atlas

Saídas:
- **atlas_out**: projeto de atlas fundido
- **merged_out**: saída fundida legada
- **merged_atlas_out**: saída fundida legada

Casos de uso:
- Combinar o atlas da personagem com o atlas de armas
- Fundir sprites base com conteúdo DLC
- Recompor após processamento paralelo de atlas

Pipeline típico:
```
InputA → Unpacker → Repacker ─┐
                               ├→ Atlas Merger → Unpacker → Repacker → Output
InputB → Unpacker → Repacker ─┘
```
Antes do Repacker, os dados são sprites individuais; depois do Repacker tornam-se um projeto de atlas. O Atlas Merger combina os projetos de atlas, e uma passagem final Unpacker → Repacker reempacota tudo de forma mais compacta num único atlas unificado.

Asset Viewer

Mostra sprites individuais de um atlas desempacotado.

Objetivo: ferramenta visual de depuração para manipulação de atlas.

Utilização: aceita 'sprites_data' do nó Atlas Unpacker e permite ver cada imagem extraída, rever as suas propriedades (dimensões, rotação, etc.) e verificar a correção visual após o unpacking.