Na atualização, melhoro a implementação do filtro.
Primeira abordagem
Na primeira implementação, criei dois elementos filter com os seguintes ids:
distorion-filter, que usava os elementosfeTurbulenceefeDisplacementMappara criar o efeito de desenho irregularblur-filter, que usava o elementofeGaussianBlurpara adicionar um pouco de desfoque
Com os elementos filter definidos, os apliquei em dois elementos g aninhados para aplicar um filtro em cima do outro:
Omiti alguns elementos e atributos para manter o código conciso.
<svg> <defs> <filter id="distortion-filter"> <feTurbulence /> <feDisplacementMap /> </filter> <filter id="blur-filter"> <feGaussianBlur /> </filter> <!-- elementos `path` --> </defs> <!-- elemento `rect` --> <g filter="url(#blur-filter)"> <g filter="url(#distortion-filter)"> <!-- elementos `use` --> </g> </g></svg>Esta abordagem funcionou, mas existe uma forma mais correta e que apresenta um desempenho melhor.
Atributos result, in e in2
Utilizei os atributos result, in e in2 na abordagem anterior, passando o resultado do elemento feTurbulence para a entrada do elemento feDisplacementMap.
Da mesma forma, desta vez usei o resultado do elemento feDisplacementMap como entrada do elemento feGaussianBlur, usando os atributos result e in, respectivamente.
Assim, eliminei a necessidade de dois elementos filter, e de dois elementos g aninhados:
Omiti alguns elementos e atributos para manter o código conciso.
<svg> <defs> <filter id="distortion-filter"> <feTurbulence type="turbulence" baseFrequency="1" numOctaves="2" seed="0" result="turbulence" > <!-- elemento `animate` --> </feTurbulence> <feDisplacementMap in="SourceGraphic" in2="turbulence" scale="0.3" result="displacement-map" /> <feGaussianBlur in="displacement-map" stdDeviation="0.06" /> </filter> <!-- elementos `path` --> </defs> <!-- elemento `rect` --> <g filter="url(#distortion-filter)"> <!-- elementos `use` --> </g></svg>Resultado
Com essa pequena mudança, melhorei a fluidez da animação no Safari:

Primeira abordagem

Segunda abordagem