2015-02-06 6 views
6

저는 부드러운 전환과 애니메이션이 필요한 프로젝트를 수행해 왔습니다. 우리는 최근 Javascript를 사용하여 거의 100 % 시간에 CSS 애니메이션으로 마이그레이션했습니다.CSS 3 애니메이션. translate3d 대 매트릭스

translate3d는 모바일과 데스크톱 모두에서 매우 매끄러운 멋진 애니메이션을 제공합니다.

나의 현재 살리는 스타일은 다음과 같이이다 :

는 CSS

:

.animation-up{ 
    transform: translate3d(0, -100%, 0); 
} 

.animation-down{ 
    transform: translate3d(0, 100%, 0); 
} 

.animation-left{ 
    tranform: translate3d(-100%, 0, 0); 
} 

.animation-right{ 
    tranform: translate3d(-100%, 0, 0); 
} 

최근, 나는 많은 잡음을 받고있는 것으로 보인다 다른 프레임 워크를 조사하기 시작했다. 특정 GreenSock (http://greensock.com/tweenmax)과 Famo.us (http://famo.us)의 2 개. 둘 다 놀라운 프레임 속도와 놀라운 성능을 보여줍니다.

나는 마티스 변환을 사용하고있는 것으로 나타났습니다.

Greensock 예 (사용 매트릭스) :

<div class="box green" style="transform: matrix(1, 0, 0, 1, 0, 100);"></div> 
이 는 (사용하여 3D 매트릭스) Famo.us 예

: 내 질문은

<div class="famous-surface" style="transform-origin: 0% 0% 0px; transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 149, 385, 0, 1);"></div> 

이 ... 차이 무엇입니까 translate3d와 매트릭스 사이? translate3D 이상의 매트릭스를 사용하여 큰 발전이 있습니까? 더 나은 결과를 산출하는 또 다른 방법이 있습니까?

나는 translate3D에 만족했지만, 가장 매끄러운 최고의 애니메이션을 제공 할 방법을 배우고 어쩌면 그게 무엇인지에 대한 지침을 찾고 싶습니다.

답변

3

Nit가 정확합니다. 대부분의 실제 시나리오에서 translate3d()와 matrix3d ​​() 사이의 성능은 구별 할 수 없습니다. 궁극적으로 모든 변환은 GPU가 어떻게 렌더링하는지 (적어도 내 이해) 때문에 어느 수준에서 매트릭스로 변환됩니다.

matrix() 및 matrix3d ​​()에는 위치 데이터뿐만 아니라 회전, 크기 조절 및 비뚤어 짐이 포함되어 있습니다.

matrix()와 matrix3d ​​() 사이에 성능 차이가 있는지 묻는 질문에 대답이 "가끔"입니다.matrix3d ​​() (또는 3D 관련 변환)는 일반적으로 브라우저가 해당 요소를 "레이어 화"(픽셀 사진을 찍어서 GPU에 저장하는 것과 같음)하여 픽셀이 분리되어 있기 때문에 조작이 더 빠릅니다 나머지 화면/레이어 '에서 가져옵니다. 일반적으로이 기술로 더 부드러운 애니메이션을 볼 수 있습니다. 그러나 처음에는 무언가를 레이어 화하는 데 약간의 비용이 듭니다 (픽셀을 GPU로 셔틀 링).

matrix3d ​​()의 다른 단점은 대부분의 브라우저가 픽셀을 특정 크기 (요소의 자연 크기)로 캡처한다는 점입니다. 따라서 크기를 조정하면 퍼지거나 픽셀이 나타납니다. 다시 말하지만, 이것은 일반적으로 무언가를 스케일링하는 경우에만 중요합니다. UP. 오, 그리고 뭔가를 레이어링하면 기억력을 차지합니다. GPU의 메모리를 초과하면 작업 속도가 느려질 수 있습니다. 내 경험상, 이것은 거의 발생하지 않습니다.

GreenSock's GSAP의 최신 버전은 가장 매끄러운 결과를 제공 할 가능성이 가장 높은 기술을 자동으로 사용합니다. 직책 만 변경하는 경우 translate3d()를 사용합니다. 크기를 조정하고 이동하면 translate3d() 및 scale()이 사용됩니다. 회전 또는 비뚤어 짐이있는 경우 matrix3d ​​()로 이동합니다. 가장 빠르기 때문입니다. 버전 1.15.0부터는 force3D : "auto"를 사용합니다. 즉, 트위닝 중에 3D를 사용하여 레이어 화의 이점을 얻은 다음 애니메이션이 끝나면 다시 GP로 전환하여 GPU 메모리를 확보합니다. 고도로 최적화 된 시스템입니다. 당신이 원하는 기술을 사용하도록 강요 할 수 있습니다.

CSS 및 JS 애니메이션의 성능을 분석 할 때 몇 가지 흥미로운 발견을 발견했습니다. 나는 당신이 체크 아웃하고 싶어 할지도 모르는 screencast를 녹음했다 : http://greensock.com/css-performance/ (역시 읽어야한다).

3

코어에서 translate3d()matrix3d()은 매트릭스 변환입니다.

translate3d(dx, dy, dz)

:

Sample image 1

matrix3d(a1, a2, a3, a4, b1, b2, b3, b4, c1, c2, c3, c4, d1, d2, d3, d4) :

Sample image 2

전자는 단순히 후자는 전체 행렬을 지정할 수 있습니다 동안 만 요소를 이동 속기이다. 둘 다 동일한 기초 구조를 사용하기 때문에 성능은 거의 동일합니다 (유사한 규모의 작업에 대해서).

+0

는 행렬을 Matrix3D 사이의 성능 차이가 무엇입니까? – w3bMak3r

1

고려해야 할 또 다른 사항은 특히 애니메이션을 설정하면 회전을 설정하는 모든 옵션이 제공되는 것이 아니라 회전을 설정하는 경우입니다.

가장 확실한 것은 rotate (0deg)에서 rotate (360deg)까지 움직이는 것입니다. 둘의 등가 행렬은 동일합니다 (명백하게). 회전으로 변환을 설정해야합니다. 그렇지 않으면 작동하지 않습니다.

복잡한 변환에서 일반적으로 변환을 매트릭스로 설정해도 원하는 애니메이션이 제공되지 않습니다. 당신은 단지 번역을 사용하는 경우 제목에서 알 수 있듯이

그러나,이의 아무것도 문제

+0

명확한 것은 순수 CSS에 대해 이야기 할 때만 해당됩니다. GSAP는 행렬을 사용하여 변환을 적용하지만 360도 또는 720 또는 어떤 식 으로든 후드에서 데이터를 관리하는 방식으로 회전하는 데 아무런 문제가 없습니다. 그러나 당신은 CSS에서 올바른 매트릭스를 정의하는 것이 이러한 한계를 가지고 있습니다. – Jack

관련 문제