Usei o Blender VSE sem querer
(aras-p.info)- Aras nem sabia que o Blender tinha um Video Sequence Editor (VSE), mas depois de visitar a Blender HQ contribuiu em meio período por cerca de dois meses com melhorias de desempenho e qualidade para o Blender 4.1
- A mudança mais visível foi a responsividade da timeline: no projeto Sprite Fright, com cerca de 3.000 strips visíveis, a UI de rolagem e pan passou de cerca de 15 fps para mais de 60 fps
- Foram aplicados multithreading, SIMD e simplificação matemática à conversão RGB↔YUV baseada em ffmpeg, ao resampling de áudio do Audaspace, à transformação e filtragem de imagens e ao processamento de efeitos do VSE
- Em três datasets do Blender Studio, o tempo final de renderização de filmes no VSE ficou cerca de 2x mais rápido no PC do autor, e a renderização de Sprite Fright caiu de quase 13 minutos para 7 minutos
- No total, 37 pull requests foram revisados e mesclados; as mudanças já estão entrando no Blender 4.1, e o trabalho posterior no VSE deve continuar a partir do Blender 4.2
Como ele acabou contribuindo para o Blender VSE
- Aras foi a Amsterdã para participar do Unite 2023 da Unity e, no tempo livre, visitou a Blender HQ
- Lá, Francesco e Sergey perguntaram se ele tinha interesse em contribuir com o VSE, e depois disso ele começou a mexer no Video Sequence Editor do Blender
- Mesmo sem conhecer bem edição de vídeo, timeline, sequencer, color grading, ffmpeg ou mixagem de áudio, ele começou pelo campo com menos controvérsia: otimização de desempenho
- Após cerca de dois meses de trabalho em meio período, surgiu um pacote de melhorias para entrar no Blender 4.1
- O Blender 4.1 entrou em beta e pode ser baixado nos daily builds
Desenho da timeline e responsividade da UI
- A timeline do VSE fica na área inferior da tela e, ao dar zoom out no projeto completo Sprite Fright edit, cerca de 3.000 strips aparecem de uma vez
- Antes, só de rolar ou fazer pan nessa timeline a atualização da UI ficava em cerca de 15 fps
- Depois das mudanças, ela passou a funcionar em mais de 60 fps
- PR relacionada: #115311
- O gargalo era uma estrutura que enviava draw calls da API gráfica em blocos de dois triângulos, e no profiler Superluminal a maior parte do tempo era gasta dentro das funções “começar a desenhar um quad” e “terminar de desenhar um quad”
- Nesse processo, ele também corrigiu comportamentos estranhos na exibição da waveform de áudio e refinou a UI; a exibição da waveform agora vem ativada por padrão
- Issue relacionada: #115274
Melhorias na qualidade e velocidade da exibição de scopes
- O VSE oferece opções comuns de exibição de scopes, como histograma de imagem, waveform e vectorscope
- O histograma era desenhado com aparência pixelada e saturação muito forte, mas agora usa polígonos mais suaves, grid e menor saturação
- PR relacionada: #116798
- A opção parade da waveform tinha um problema de saturar rápido demais e, após aplicar multithreading, ficou 15x mais rápida
- PR relacionada: #115579
- O hexágono colorido externo do vectorscope era muito pixelado; ele copiou e aplicou o design atualizado do vectorscope do editor de imagens
- PR relacionada: #117738
- A opção de zebra stripes, equivalente à exibição de áreas superexpostas, também ficou de 2x a 3x mais rápida
- PR relacionada: #115622
- Ele também comenta que todos os scopes, assim como os do editor de imagens, deveriam um dia ser processados com compute shaders na GPU
Otimização da conversão RGB↔YUV no ffmpeg
- O Blender usa principalmente a biblioteca ffmpeg para leitura e escrita de áudio e vídeo
- Internamente, o Blender não usa a ferramenta de linha de comando do ffmpeg, mas bibliotecas como libavcodec; a
libswscaleé responsável pela conversão RGB↔YUV dos frames de vídeo - A
libswscalesuporta conversão multithread, mas se você usar apenassws_getContext()esws_scale()ela opera totalmente em thread única - Para usar multithreading, era preciso definir o parâmetro
"threads"na inicialização, usando diretamentesws_alloc_context(),av_opt_set_int()esws_init_context() - Além disso,
sws_scale()não faz multithreading internamente, então foi necessário usarsws_scale_frame(), e nesse processo também apareceu um problema na forma comoAVFrameera criado - Como resultado, a conversão RGB→YUV na gravação de arquivos de vídeo ficou consideravelmente mais rápida
- PR relacionada: #116008
- Na leitura de arquivos de vídeo, ele também passou a usar conversão multithread de YUV→RGB e integrou o vertical flip à mesma etapa
- PR relacionada: #116309
Resampling de áudio
- Ao renderizar vídeo no VSE, foi identificado que quase metade do tempo de “gerar frames de vídeo ou áudio” era gasto dentro da biblioteca de áudio Audaspace usada pelo Blender
- O gargalo não era a codificação de áudio, mas a mixagem antes da codificação; a maior parte do tempo era consumida pelo resampling quando strips de áudio como 44,1 kHz eram misturados em um filme de 48 kHz
- O Audaspace tinha dois modos de resampling
- Reprodução dentro do Blender: Linear resampler, com interpolação linear entre amostras
- Renderização de filme: resampler baseado no algoritmo de Julius O Smith
- A qualidade dos resamplers foi comparada fazendo resampling de um som sintético de frequência única crescente e analisando o spectrogram
- O objetivo era obter um resultado com o mínimo possível de frequências extras, como na configuração “best” do Audacity
- O resampling de preview do Audaspace era rápido de calcular, mas gerava muitas frequências extras; o de renderização tinha boa qualidade no spectrogram
- Ele adicionou uma nova qualidade média de resampling ao Audaspace e, na visão dele, ela produz resultado quase igual com cálculo cerca de 3x mais rápido
- O Blender passou a usar essa configuração média durante a renderização
- Em um PC Windows com Ryzen 5950X, a renderização de 2.000 frames de Sprite Fright caiu de 92 segundos para 73 segundos
- PR relacionada: #116059
Transformação e filtragem de imagens
- No VSE, strips que produzem resultado visual — como imagem, vídeo, texto e scene — podem aplicar posição, rotação, escala e crop
- Essas transformações funcionam convertendo a imagem gerada pelo strip em uma nova imagem, e isso já era processado em multithread na CPU
- O motivo de isso ser feito na CPU em vez da GPU é que ainda não existe implementação em GPU, e por enquanto também é necessário um fallback em CPU para casos de uso como renderização em render farms sem GPU
-
Correção de erros de meio pixel
- O código antigo tinha vários erros de off by half a pixel; em muitos casos eles se anulavam ou passavam despercebidos, mas em situações específicas apareciam
- Ao ampliar uma imagem pequena em 16x, o filtro Bilinear deslocava a imagem em meio pixel do original, e ainda surgia vazamento da cor de fundo magenta
- No caso oposto, ao reduzir exatamente 2x, o filtro Bilinear não fazia filtragem nenhuma
- Foram corrigidos erros de “off by alguma coisa” tanto do Bilinear quanto de outros filtros
- PR relacionada: #116628
-
Tratamento da borda transparente no Bilinear
- Antes do Blender 4.0, o VSE tinha três opções de filtro:
Nearest,BilineareSubsampled3x3; entre elas, só o Bilinear adicionava transparência com meia largura de texel ao redor da imagem resultante - Esse comportamento ficava visível ao ampliar mídia, e ninguém mais lembrava por que existia essa diferença
- Ele removeu do código do filtro Bilinear do VSE o comportamento de “misturar com transparência”
- Porém, ao aplicar apenas rotação, esse tratamento antigo acabava criando uma espécie de antialiasing nas bordas; então ele passou a aplicar transparency anti-aliasing nos pixels de borda da imagem de destino
- PR relacionada: #117717
- Antes do Blender 4.0, o VSE tinha três opções de filtro:
-
Filtros Cubic, Box e Auto
- As transformações normais de strip no VSE não tinham opção de filtro cubic; isso existia apenas no strip especial Transform Effect
- No Blender, “Bicubic” na prática significa filtro Cubic B-Spline, equivalente aos coeficientes B=1, C=0 do filtro Mitchell-Netravali
- O autor resume isso como uma opção “sem ringing, mas com bastante blur”
- Duas opções de filtragem cúbica foram adicionadas ao VSE
- PRs relacionadas: #117100, #117517
- O filtro “Subsampled 3x3” do Blender 3.5 era na verdade um box filter fixo de 3x3, e começava a falhar ao reduzir em proporções diferentes de 3x3
- Esse filtro foi trocado por um Box filter ajustado, em vez de um 3x3 fixo
- PR relacionada: #117584
- Como agora há muitos filtros para o usuário escolher, foi adicionada uma opção Auto como padrão para filtros de strips do VSE
- PR relacionada: #117853
- Se não houver escala nem rotação, usa
Nearest - Se houver ampliação maior que 2x, usa
Cubic Mitchell - Se houver redução maior que 2x, usa
Box - Nos demais casos, usa
Bilinear
-
Melhorias de desempenho na filtragem
- O processo de filtragem de imagem também ficou mais rápido
- Remoção de virtual function no loop interno e aplicação parcial de SIMD ao filtro Bilinear: #115653
- Simplificação do filtro Cubic e adição de SIMD: #117100
- Simplificação matemática do filtro Box: #117125
- Correção de um problema em que a otimização para pular itens sob uma imagem sólida cobrindo a tela inteira não funcionava quando havia escala: #117786
- No PC do autor, em um projeto 3840x2160 com uma única imagem 1920x1080 ampliada em 2x usando filtragem Bilinear, o desenho completo do preview do sequencer caiu de 36,8 ms para 15,9 ms
- Ele também disponibilizou uma página interativa para comparar filtros de upsampling: aras-p.info/img/misc/upsample_filter_comp_2024
Otimização de efeitos do VSE
- Os datasets reais de filmes do Blender Studio não usavam muitos effects, mas ele ainda assim otimizou efeitos do VSE com foco no que aparecia no código
- A maior parte das mudanças foi aplicação de multithreading
- Efeito Glow: multithread aplicado, 6x a 10x mais rápido #115818
- Efeito Wipe: multithread aplicado, simplificação do excesso de cálculos trigonométricos no Clock wipe, 6x a 20x mais rápido #115837
- Efeito Gamma Cross: troca de uma abordagem com tabela complexa e interpolação usada para evitar uma única chamada de raiz quadrada, ficando 4x mais rápido #115801
- Efeito Gaussian Blur: evita cálculos redundantes e fica 1,5x mais rápido #116089
Mudanças no tempo de render final
- Com base em três datasets recebidos do Blender Studio, o tempo final de renderização de filmes no VSE no PC do autor ficou cerca de 2x mais rápido
- A renderização do Sprite Fright edit caiu de quase 13 minutos para 7 minutos
- O autor diz esperar ganhos adicionais e resume isso com algo como “se eu conseguir melhorar 2x mais três vezes, já fica bem bom”
Forma de trabalho e próximos passos
- Além das mudanças visíveis para usuários, houve pull requests para adicionar testes, fazer refatoração e limpeza, totalizando 37 pull requests concluídos, revisados e mesclados
- O autor avalia que teria sido difícil fazer esse tanto de trabalho em um “emprego de verdade”
- Na Unity entre 2015 e 2022, ele acha que teria feito cerca de 30% disso no mesmo tempo, talvez até menos
- Ele acrescenta que talvez isso fosse possível na Unity “ancient” por volta de 2010
- Na visão dele, quando entram em cena fatores como tamanho da empresa, processos, expectativas, comunicação e política, o ambiente corporativo pago pode tornar o mesmo trabalho mais lento ou até levá-lo ao cancelamento no meio do caminho
- Ele espera que o Blender não siga para um nível de escala, complexidade e workflow em que os processos passem a desmotivar e atrasar as pessoas em vez de ajudá-las
- Como o Blender 4.1 entrou em beta, a parte funcional já está concluída, e as mudanças do VSE para a versão 4.1 estão entrando no estado atual das release notes
- O trabalho do Blender 4.2 está começando, e ele pretende continuar mexendo no VSE sem um plano muito definido
- O andamento pode ser acompanhado na seção de fórum Weekly Updates
1 comentários
Opiniões no Hacker News
Acho que eu não teria conseguido fazer algo assim se fosse um “emprego de verdade”
Se há algo que não deu certo na minha carreira, foi essa divisão: em um projeto não remunerado em que eu resolvia matemática nada trivial por conta própria, eu fazia em dois meses mais do que normalmente faria em dois anos; já em projetos pagos, meus resultados tendiam a ser bem medianos
Tentei muito encontrar um meio-termo, mas não consegui; no ano passado, quando surgiu a possibilidade de receber por algo que eu fazia de graça, acabei simplesmente não conseguindo tocar no assunto
Então encontrei a teoria da alienação de Marx, e ela começou a fazer muito mais sentido. Ele partiu da observação de que o trabalho é uma atividade que pessoas saudáveis costumam realizar, mas achava que isso não deveria ser confundido com trabalhar para outra pessoa e ser alienado do produto do próprio trabalho
https://en.m.wikipedia.org/wiki/Marx's_theory_of_alienation
Alguns lugares têm um bom sistema, com um período de folga de 1 a 2 semanas em que você pode fazer qualquer coisa, e isso ajuda a aliviar esse problema
Em projetos de paixão, como você não é pago, as expectativas são baixas, não há obrigação de fazer algo, e na prática você tem liberdade para fazer o que quiser. Assim, acaba escolhendo trabalhos interessantes e impactantes para si, como explorar uma nova tecnologia ou ferramenta que lhe interessa
No momento em que dinheiro entra na equação, entram também as expectativas de quem paga, e tentar algo novo e desconhecido fica mais difícil porque a chance de falhar é maior
No fim, quando há dinheiro envolvido, acho que as pessoas evitam riscos altos mesmo quando pode haver uma solução melhor, e preferem resultados previsíveis
É realmente impressionante, e também é claro que o autor do post original não simplesmente entrou andando na sede da Blender vindo da rua. A longa experiência dele na Unity deve ter ajudado bastante a entender essa área
Gostei especialmente desta mudança [1]. Ao otimizar a etapa de processamento de imagens, ele removeu um monte de “otimizações” baseadas em tabelas e simplesmente as substituiu por cálculos de ponto flutuante, o que ficou cerca de 4 vezes mais rápido na máquina do autor. Excelente
[1]: https://projects.blender.org/blender/blender/pulls/115801/fi...
return c * c;é mesmo uma boa aproximação da gama sRGBUma das minhas coisas favoritas dos últimos anos tem sido ver o Aras entrar do nada em vários projetos gráficos open source, produzir melhorias e ganhos enormes de velocidade, e então passar para outro projeto gráfico aleatório e repetir o processo
https://github.com/aras-p/UnityGaussianSplatting
Eu queria fazer algo assim no player de música que uso, o MusicBee
Se ele fosse open source, claro. O criador quase não mexe mais nele, ele sempre foi totalmente gratuito, e não entendo por que não é open source
Há tantos pequenos incômodos, partes quebradas, lentas ou estranhas, que eu adoraria consertar no meu tempo livre
E, a esta altura, migrar para outra coisa como FooBar dá trabalho demais. Também experimentei o HQPlayer, mas a UI/UX é tão terrível que não consegui mudar
Ele disse que liberar o código-fonte quando não quiser mais continuar o projeto é uma das opções que consideraria, mas que este é um projeto de hobby feito porque programar é divertido, e que jamais pretende tocá-lo de forma profissional
Como já passa tempo suficiente no trabalho principal gerenciando pessoas, não quer fazer isso aqui também; e disse ainda que, se alguém se preocupa com coisas como “e se ele for atropelado por um ônibus?”, o certo é usar outro aplicativo
https://web.archive.org/web/20170721042120/https://getmusicb...
Se ainda estivesse sendo mantido, eu consideraria rodá-lo no Wine, mas hoje desisti do próprio conceito de gerenciador de música e simplesmente reproduzo os álbuns que quero ouvir no mpv. E sempre ouço por álbum. Playlists, não obrigado
Desde 2020 uso o Blender VSE para toda edição de vídeo, e é muito bom ver as melhorias
Considerando a estabilidade e o conjunto de recursos, eu já o via como o melhor editor de vídeo no Linux. O fato de poder usar todas as ferramentas de animação existentes do Blender também é uma vantagem
O VSE realmente precisa de muito carinho. Eu queria usar todas as ferramentas em código aberto no podcast, mas, ao renderizar no Blender uma sequência mp4 com chroma key, um vídeo de 1,5 hora levou 10 horas
Acabei migrando para a versão gratuita do DaVinci Resolve
Além disso, mesmo quando não é preciso recodificar, ele não consegue pular essa etapa como o DaVinci Resolve e renderiza cada quadro, um por um. Se isso for melhorado, vai ajudar muito no desempenho e na eficiência do Blender
No passado, experimentei um plugin [1] que iniciava vários trabalhos de renderização em pontos diferentes da timeline como processos separados, e isso conseguia acelerar bastante a renderização
Hoje migrei para o Resolve também no Linux, porque uso câmeras Blackmagic e ele se encaixa melhor nesse fluxo
[1] https://github.com/AkBKukU/blenderSubprocessRender
Agora estou trabalhando na nova versão no Final Cut Pro
Tornar qualquer parte do programa 3D Blender mais rápida parece ser bem difícil. Ele já é, de longe, o aplicativo 3D que inicia mais rápido, e a GUI também é a mais responsiva
O Houdini fica em segundo lugar, mas não é um segundo lugar nem de perto
Alguns anos atrás, mexendo no código de um gerador “blobby”, adicionei multithreading e o deixei muito mais lento. Quando passava do overhead do multithreading, ficava mais rápido, mas, pelo que lembro, isso não se encaixava bem nos casos de uso comuns, então desisti. Com certeza também devo ter cometido alguns erros
Por exemplo, a pintura de texturas faz algo como três indireções de ponteiro por pixel, e mesmo no meu PC dá bastante engasgo
Ele disse: “Você sabia que o Blender tem um conjunto de ferramentas de edição de vídeo? Eu também não sabia :)”, mas acho que a maioria das pessoas que cria animações com o Blender sabe disso
Porque é a forma básica de transformar os quadros renderizados em um arquivo de vídeo
Também dá para usar o compositor para transformar uma sequência de quadros pré-renderizados em um arquivo de vídeo
Ainda assim, acho que a maioria prefere editar vídeo em outro programa, como o Resolve, e o VSE parece ficar em um nicho estreito de “preciso de cortes básicos, mas não preciso de transformações, títulos nem efeitos”, então não é muito usado
Seria bom se alguém continuasse melhorando transformações e efeitos e, um dia, também adicionasse edição de 3 pontos
Ah, então era o Aras. Ele é incrível. Pelo que lembro, o nome completo dele era realmente o grande Aras
Ele é excelente em programação gráfica e afins, e parece ter um bom fluxo de imersão quando programa
Os textos dele são agradáveis e divertidos de ler. Parece que você está ouvindo uma pessoa falar. Inclusive frases no meio como “However!”
Também me identifiquei com a parte final, sobre a produtividade cair para 30% quando alguém é esmagado pelas expectativas de cultura e processos padrão em uma empresa comum. O custo de manter funcionários presos ao “próprio trabalho” realmente inclui uma enorme queda de produtividade
Espero que, ao ver cada vez mais casos como esse, tecnólogos aprendam formas melhores de organizar pessoas e atividades, confiem nesse aprendizado e comecem a integrar alta produtividade/alto foco às formas reais de organização
Como o texto sugere, isso pode tornar trabalhar na indústria de tecnologia mais prazeroso. Talvez quase tão divertido quanto brincar com tecnologia
Acrescentando sobre https://projects.blender.org/blender/blender/pulls/116089,
inlineafeta antes de tudo a regra de definição únicaEm termos simples, se você definir uma função em um header e chamá-la a partir de vários arquivos
.cc, terá erro do linker a menos que ela seja marcada comoinlineO efeito sobre a otimização real de inline varia de “nenhum” a “o compilador pode atribuir pesos diferentes por causa do modo de ligação” e “ele realmente trata como uma dica”, e há considerações parecidas em otimização em tempo de link
Para dar ao compilador um sinal muito mais forte de inline, especialmente se for uma função usada apenas dentro do arquivo em que foi definida, é melhor defini-la dentro de um namespace anônimo
A intenção original ao colocar
inlinenessa função pode ter sido tentar obter inlining de fato. Não está claro se há um ganho mensurável, mas também não é impossível