CSS3에서 하드웨어 가속을 활성화하면 성능이 저하되는 이유는 무엇입니까?


82

난에서 전환 사용하여 CSS3 실험에 6000 개 작은 DIV 요소를 이동하고 top: 0top: 145px테스트 성능을.

하드웨어 가속을 사용 하지 않으면 Chrome에서 원활하게 실행됩니다.

translateZ(0)성능을 통해 하드웨어 가속을 활성화 하면 끔찍해집니다.

왜 이렇게이다?

다음은 내 예제 코드입니다. http://dl.dropboxusercontent.com/u/17844821/tmp/hwtest.html


업데이트 (2014-11-13) :이 질문이 여전히 주목을 받고 있기 때문에 언급 된 끊김 현상이 최신 하드웨어에 제공된 데모 에서 더 이상 표시되지 않을 수 있지만 문제 자체가 여전히 존재하는 것 같다는 점을 지적하고 싶습니다 . 이전 장치는 여전히 성능 문제를 볼 수 있습니다.


9
진짜 질문은 왜 일부 브라우저가 제작자가 하드웨어 가속을 활성화하기 위해 "null"변환과 같은 어리석은 해킹에 의존하기를 원하는지입니다. Firefox는 가능한 한 GPU에 의존하지만 IE는 _ALL_ THINGS를 가속합니다! 그럼에도 불구하고 흥미로운 질문은 이와 같은 해킹이 때때로 역효과를 낼 수 있음을 보여주는 것처럼 보입니다.
BoltClock

2
@ BoltClock'saUnicorn 기본적으로 동의합니다. 그러나 브라우저 간 문제가 항상 이와 같지 않았습니까? :-)
Timo

6
꽤 오래 전에이 질문을했지만 이제 이동 된 항목의 수가 문제에 큰 영향을 미치는 것 같습니다. 모든 3D 가속 레이어를 GPU로 전송해야하기 때문에 3D 가속을 사용할 때 작은 항목을 많이 옮기는 것보다 몇 개의 큰 물체를 이동하는 것이 더 성능이 좋습니다. 따라서 GPU가 잘 작동하더라도 많은 객체의 전송이 문제가 될 수 있으므로 GPU 가속을 사용하는 것이 그만한 가치가 없을 수 있습니다.
Timo 2013 년

1
모든 브라우저의 예제에서 성능 차이가 보이지 않으며 더 이상 재현 할 수없는 것으로 종료하도록 투표했습니다.
Jason C

1
@Timo 방금 최신 Firefox 및 Chrome이 무엇인지 확인하고 Windows 7 64 비트의 IE11, nVidia 4200M이 장착 된 상당히 오래된 2.3GHz i5 Thinkpad에서 두 옵션 모두 나에게 순조롭게 보입니다. 어깨를 으쓱
Jason C

답변:


100

나는 항상 추가한다 :

-webkit-backface-visibility: hidden;
-webkit-perspective: 1000;

3D 변환으로 작업 할 때. "가짜"3D 변환도 가능합니다. 경험에 따르면이 두 줄은 특히 iPad뿐만 아니라 Chrome에서도 항상 성능을 향상시킵니다.

나는 당신의 모범을 테스트했고, 내가 말할 수있는 한 작동합니다.

질문의 "왜"부분은 ... 모르겠습니다. 3D 변환은 젊은 표준이므로 구현이 고르지 않습니다. 그것이 바로 베타 테스트를 위해 접두사 속성 인 이유입니다. 누군가 버그 보고서 나 질문을 작성하고 팀이 조사하도록 할 수 있습니다.

2013 년 8 월 19 일 수정 :

이 답변에 대한 정기적 인 활동이 있으며 IE10에도 이것이 필요하다는 것을 알았습니다. 그러니 잊지 마세요 :

backface-visibility: hidden;
perspective: 1000;

3
다른 테스트를했습니다. 기본적으로 테스트 # 1과 동일하지만 이번에는 -webkit-transform: rotateZ(360deg); dl.dropbox.com/u/17844821/zeug/hwtest2.html을 통해 상자가 z 축을 중심으로 회전하도록했습니다. 이번에는 하드웨어 가속 버전이 더 빠릅니다! 회전을 제거하면 하드웨어 가속으로 인해 애니메이션 속도가 느려집니다. 당신의 이론이 사실이라면 이것은 작동하지 않아야합니다 (유일한 차이점은 내가 추가했기 때문입니다 rotateZ(360)). 반면에 크롬은 Z 축을 중심으로 회전 할 때 타일 뒷면을 다시 그릴 필요가 없다는 것을 인식 할만큼 똑똑 할 수 있습니까?
Timo 2012

1
이것은 더 이상 :-( iOS6의의 경우입니다
마이클 Mullany


7
이 줄을 추가 할 위치 를 추가 해야합니다 . 일반 "이것을 추가하십시오 .."라는 말이 아니라 내가 어디에 있는지 알고 있지만 많은 사람들은 그렇지 않습니다.
vsync 2014 년

4
애니메이션 할 요소의 부모에 추가합니다.
mddw

7

널 변환 핵 ( translateZ(0)) 을 추가했을 때 애니메이션이 느려진 이유 는 각 널 3D 변환이 새 레이어를 생성하기 때문입니다. 이러한 레이어가 너무 많으면 브라우저가 GPU에 많은 텍스처를 보내야하기 때문에 렌더링 성능이 저하됩니다.

이 문제는 2013 년에 Apple 홈페이지에서 발견되었으며 null transform hack을 악용했습니다. 참조 http://wesleyhales.com/blog/2013/10/26/Jank-Busting-Apples-Home-Page/를

OP는 또한 댓글 에서 설명을 올바르게 발견했습니다 .

모든 3D 가속 레이어를 GPU로 전송해야하기 때문에 3D 가속을 사용할 때 작은 항목을 많이 옮기는 것보다 큰 물체를 몇 개 옮기는 것이 더 성능이 좋습니다. 따라서 GPU가 잘 작동하더라도 많은 객체의 전송이 문제가 될 수 있으므로 GPU 가속을 사용하는 것이 그만한 가치가 없을 수 있습니다.


6

흥미 롭군. 에서 몇 가지 옵션 about:flags, 특히 다음 옵션을 사용해 보았습니다 .

모든 페이지에서 GPU 합성 GPU 가속 레이어를 포함하는 페이지뿐만 아니라 모든 페이지에서 GPU 가속 합성을 사용합니다.

GPU 가속 그리기 합성이 활성화 된 경우 페이지 콘텐츠의 GPU 가속 그리기를 활성화합니다.

GPU 가속 캔버스 2D GPU (Graphics Processor Unit) 하드웨어를 사용하여 렌더링하여 2D 컨텍스트로 캔버스 태그의 성능을 높일 수 있습니다.

그것들을 활성화하고, 시도했고, 체크 박스가 활성화 된 상태에서 비참하게 실패했습니다 (당신처럼). 하지만 또 다른 옵션을 발견했습니다.

FPS 카운터 하드웨어 가속이 활성화 된 경우 페이지의 실제 프레임 속도를 초당 프레임 수로 표시 합니다.

플래그 설명의 하이라이트를 감안할 때 위의 옵션이 켜져있는 FPS 카운터를 보았 기 때문에 확인란을 선택하지 않아도 하드웨어 가속이 실제로 켜져 있다고 추측합니다!

요약 : 하드웨어 가속은 결국 사용자 기본 설정입니다. 더미로 강제하면 translateZ(0)중복 처리 오버 헤드가 발생하여 성능이 저하되는 것처럼 보입니다 .


2
그럼 이것 좀 봐. 다른 테스트를했습니다. 기본적으로 테스트 # 1과 동일하지만 이번에는 -webkit-transform: rotateZ(360deg); dl.dropbox.com/u/17844821/zeug/hwtest2.html 을 추가하여 상자가 자체 축을 중심으로 회전하도록했습니다. 이번에는 하드웨어 가속 버전이 더 빠릅니다! 회전을 제거하면 하드웨어 가속으로 인해 애니메이션 속도가 느려집니다.
Timo

@valmar : fps 카운터를 활성화하고 있습니까? 이 새로운 예에서는 하드웨어 가속이 여전히 강제됨을 의미하는 확인란을 설정하는 방법에 관계없이 확인합니다. 나는 당신의 질문은 "왜 아래로 비등 생각 translateZ(0)보다 느리다 rotateZ(360deg)"
오븐

사실은 아닙니다. translateZ(0)항상 활성화되어 있습니다. 실제로 3D 가속을 트리거하는 데 필요합니다. rotateZ(360deg)회전 애니메이션을 추가합니다. 그래서 질문은 다음과 같습니다. 3D 하드웨어 가속을 사용하는 애니메이션 rotateZ(360deg)이없는 것보다 더 부드럽 습니까?
Timo

1
믿을 수 없습니다. 무거운 이미지의 회전은 하드웨어 가속없이 더 빠릅니다 ...
ProblemsOfSumit

0

크롬에서 chrome : // flags를 확인하십시오. 그것은 말한다

"스레드 합성이 활성화되면 가속화 된 CSS 애니메이션이 합성 스레드에서 실행됩니다. 그러나 합성 스레드 없이도 가속화 된 CSS 애니메이션으로 실행하면 성능이 향상 될 수 있습니다."


여기 chrome : // flags에서 해당 옵션을 찾을 수 없습니다. 이 기능을 끄면 하드웨어 가속 버전이 비가 속 버전보다 더 빠릅니까?
Timo

이제이 옵션은 DevTools 설정에 있습니다
Dmitry Pashkevich

0

내 경험은 GPU가 모든 종류의 그래픽에 대해 일반적으로 더 빠르지는 않다는 것입니다. 매우 "기본"그래픽의 경우 더 느릴 수 있습니다.

이미지를 회전하는 경우 다른 결과를 얻을 수 있습니다. 이것이 GPU가 잘하는 일입니다.

또한 translateZ (0)은 3 차원 작업이고 위쪽 또는 왼쪽 변경은 2 차원 작업입니다.


구현 문제 일 가능성이 높습니다. GPU는 당신이 바로 그것을 구현하는만큼, 훨씬 더 빨리 모든 그래픽입니다)
scientiaesthete

1
translateZ(0)실제로 3D 하드웨어 가속을 "활성화"하는 것 외에는 수행하지 않습니다. 해킹이지만 작동합니다. 해당 css 속성을 추가 할 때 선택한 html 요소와 모든 하위 요소는 CPU가 아닌 GPU에 의해 강제 계산됩니다.
Timo

저수준 구현 세부 사항을 모두 알지 못합니다. QT와 비슷한 문제가있었습니다. 하드웨어 가속으로 인해 속도가 느려졌습니다. 컴퓨터가 translateZ (0)을 무시할 수 있고 변환을 2 차원의 움직임으로 처리 할 수 ​​있다는 것을 컴퓨터가 인식하는지 여부를 알 수 없습니다. (원근감 없음, 앤티 앨리어싱 없음, 모든 픽셀에 대해 z + = 0 없음)
sabof

과학자 들은 명령과 메모리를 GPU와 GPU 메모리로 옮기는 데 CPU 노력이 필요하기 때문에 GPU는 모든 그래픽에 대해 수학을 수행하는 데 더 빠르지 않습니다 . 그 노력이 가치가있게되기위한 복잡성의 한계점이 있습니다. 여기 YMMV <조립하기 전에 손으로 최적화)
tomByrer

실제 계산 부분에서는 GPU가 훨씬 빠릅니다. 그러나 현재 사용 가능한 모든 GPU는 실제 계산을 시작하기 전에 상당히 무거운 설정 단계를 가지고 있습니다. "단순한"콘텐츠의 경우 CPU가 모든 렌더링을 수행하도록하는 것이 GPU 설정 + GPU 계산보다 빠를 수 있습니다. 잘 구현 된 브라우저는 자동으로 올바른 선택을 할 것이며 임의의 콘텐츠 작성자가 더 잘할 수있는 방법은 없습니다.
Mikko Rantalainen

-2

두 개의 데모를 봤는데 혼란스러운 이유를 알고있는 것 같습니다.

  1. 애니메이션 요소 왼쪽이나 위쪽을 사용하여 위치를 변경하지 말고 -webkit-transform을 사용하십시오.
  2. 모든 자식 요소는 translateZ () 또는 translate3D 사용과 같은 하드웨어 가속을 켜야합니다.
  3. FPS는 애니메이션 유창성을 측정하며 데모 FPS는 평균 20FPS에 불과합니다.

위는 개인적인 의견입니다. 감사합니다!


Stack Overflow에 오신 것을 환영합니다! 게시물에 서명 / 태그 라인을 사용하지 마십시오. 사용자 상자는 서명으로 간주되며 프로필을 사용하여 원하는 자신에 대한 정보를 게시 할 수 있습니다. 서명 / 슬로건에 자주 묻는 질문
앤드류 바버

3
나는 이미 그 이유를 설명했고, 내가 링크 한 FAQ 항목에서도 이유를 언급했습니다. 당신은 이미 서명을 - 그것은 당신의 이름과 아바타 그림을 보여줍니다 오른쪽에 모습을.
Andrew Barber

好吧,你"淫"了不过还是很感谢,还不太熟悉"유래"的规则..
一丝冰凉

1
아니에요. 이 웹 사이트는 영어로만 제공됩니다. :) 귀하의 이름은 괜찮지 만 귀하의 게시물은 영어로 작성되어야합니다.
Andrew Barber

3
苦 逼 了, 저는 영어를 못합니다. 용서 해주세요.
一丝冰凉
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.