๐ด ๊ฐ์ ์ ์ ๋๋ฉ์ด์
์ ๋๋ฉ์ด์ ๋์ ๋ฐฉ์์ css top ์์ฑ์ ์ด์ฉํ์ฌ, ๋ฉ์ถ ์ซ์์ ์์น๋ก ์ด๋ํฉ๋๋ค.
css top์ ์ด์ฉํด ์์์ ์์น๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์, animation์ด ๋ฐ์ํ๋ ๋์ reflow๊ฐ ๊ณ์ ์คํ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
reflow: ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๊ณผ์ ์ค Layout → Paint → Composite ๊ณผ์ ์ฌ์คํ
๐ง ์ฑ๋ฅ ๊ฐ์ ํ๊ธฐ
์ฑ๋ฅ ๊ฐ์ ์ ์ํด reflow ๋์ repaint๋ฅผ, repaint ๋์ composite ๊ณผ์ ๋ง ๋ฐ์๋๋๋ก ํ์ฌ ๋ ๋๋ง ๋น์ฉ์ ์ค์ผ ์ ์์ต๋๋ค.
์์ ์์น๋ฅผ ์กฐ์ ํ๊ธฐ ์ํด top ๋์ transform ์์ฑ์ ์ด์ฉํ๋ฉด, ์ ๋๋ฉ์ด์ ๋์์ ๊ฐ์ง๋ง reflow๊ฐ ๋ฐ์ํ์ง ์๊ณ composite ๊ณผ์ ๋ง ๋ฐ์ํ์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
// css top ์์ฑ
// stepperEl.style.top = `-${stepperEl.offsetHeight * stopNumber}px`;
// css transform ์์ฑ ์ด์ฉํ๊ธฐ
stepperEl.style.transform = `translateY(-${stepperEl.offsetHeight * stopNumber}px)`;
transform์ผ๋ก ๋ณ๊ฒฝ ํ ํ์ธํด ๋ณด๋ฉด reflow๊ฐ ๋ฐ์ํ์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๐ ์ฑ๋ฅ ๋น๊ตํ๊ธฐ
top ์์ฑ ์ด์ฉ | transform ์์ฑ ์ด์ฉ |
![]() |
![]() |
Rendering: 74ms → 10ms
Painting: 49ms → 8ms
cpu 6x slowdown | |
top ์์ฑ ์ด์ฉ | transform ์์ฑ ์ด์ฉ |
![]() |
![]() |
cpu ์ฑ๋ฅ์ ๋ฎ์ถ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ฐจ์ด๋ฅผ ๋ ์ ๋ณผ ์ ์์ต๋๋ค.
Rendering: 440ms → 10ms
Painting: 296ms → 8ms
๐ transform์ด ๋น ๋ฅธ ์ด์
๊ตฌ๊ธ ํฌ๋กฌ, ์คํ๋ผ, ์จ์ผ, ์ผ์ฑ ์ธํฐ๋ท ๋ฑ์์ ์ฌ์ฉ์ค์ธ Blink ์์ง์ ๋ด๋ถ์ ์ผ๋ก css transform ์์ฑ์ ๊ฐ์ง ๊ฒฝ์ฐ GraphicsLayer๊ฐ ์์ฑ๋๊ณ , Composite ๋จ๊ณ์์ compositor thread๋ผ๋ ๋ณ๋์ ์ค๋ ๋์์ ๋ ์ด์ด ํฉ์ฑ์ด ์ผ์ด๋ฉ๋๋ค.
์ ๊ณผ์ ์ GPU๋ฅผ ์ด์ฉํ๊ธฐ ๋๋ฌธ์, CPU์์ ์ฒ๋ฆฌ ๋๋ css top ์์ฑ๋ณด๋ค ์๋๊ฐ ๋ ๋นจ๋ผ์ง๋๋ค. ๊ทธ๋ฆฌ๊ณ main thread์ ๋ณ๊ฐ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
๐งท ์ฐธ๊ณ
- https://web.dev/articles/rendering-performance?hl=ko
- https://www.chromium.org/developers/design-documents/compositor-thread-architecture/
- https://www.chromium.org/developers/design-documents/gpu-accelerated-compositing-in-chrome/
- https://d2.naver.com/helloworld/5237120
- https://blog.seokho.dev/ko/development/2021/03/08/ReflowRepaint.html