Web

css animation reflow ์„ฑ๋Šฅ ๊ฐœ์„ 

presentKey 2024. 3. 30. 21:56

๐Ÿ›ด ๊ฐœ์„  ์ „ ์• ๋‹ˆ๋ฉ”์ด์…˜

'xxx๋งˆ๋ฆฌ' ์ˆซ์ž ์˜์—ญ ์• ๋‹ˆ๋ฉ”์ด์…˜

 

์• ๋‹ˆ๋ฉ”์ด์…˜ ๋™์ž‘ ๋ฐฉ์‹์€ css top ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ, ๋ฉˆ์ถœ ์ˆซ์ž์˜ ์œ„์น˜๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

 

๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ Performance

css top์„ ์ด์šฉํ•ด ์š”์†Œ์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, animation์ด ๋ฐœ์ƒํ•˜๋Š” ๋™์•ˆ reflow๊ฐ€ ๊ณ„์† ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

reflow: ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ • ์ค‘ Layout → Paint → Composite ๊ณผ์ • ์žฌ์‹คํ–‰

 

 

๐Ÿ”ง ์„ฑ๋Šฅ ๊ฐœ์„ ํ•˜๊ธฐ

์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•ด reflow ๋Œ€์‹  repaint๋ฅผ, repaint ๋Œ€์‹  composite ๊ณผ์ •๋งŒ ๋ฐœ์ƒ๋˜๋„๋ก ํ•˜์—ฌ ๋ Œ๋”๋ง ๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

reflow
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์™€ ๋ณ„๊ฐœ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋“œ๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

blink์—”์ง„ renderer process

๐Ÿงท ์ฐธ๊ณ 

- 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

- https://ssocoit.tistory.com/258