[TECH-QA] μ• λ‹ˆλ©”μ΄μ…˜ 뢄석 (Reflow와 Repaint 이둠)

μ›Ή μ• λ‹ˆλ©”μ΄μ…˜ 이미지λ₯Ό 보고 전체적인 흐름에 따라 λ¦¬ν”Œλ‘œμš° 리페인트 μŸν¬ν˜„μƒ 병λͺ©ν˜„상등을 μ•Œμ•„λ³΄κ³  μ΄ν•΄ν•˜λŠ” μ‹œκ°„μ„ κ°€μ§€λ €κ³  ν•©λ‹ˆλ‹€.
μ΄λ―Έμ§€μ΅œμ ν™” μƒ˜ν”Œ1
κ·Έλž˜ν”„λ₯Ό ν΄λ¦­ν•˜κ±°λ‚˜ νŽ˜μ΄μ§€μ— λ“€μ–΄μ„œλ©΄ μ• λ‹ˆλ©”μ΄μ…˜μ΄ μ‹€ν–‰λ˜λŠ” νŽ˜μ΄μ§€μ΄λ‹€.
μ΄λ―Έμ§€μ΅œμ ν™” μƒ˜ν”Œ2
μœ„μ˜ μ΄λ―Έμ§€μ—μ„œ TimingsλŠ” κ·Έλž˜ν”„λ₯Ό 클릭 ν• λ•Œλ§ˆλ‹€ λ¦¬μ•‘νŠΈ ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λŠ” 타이밍을 보여주고 있으며 κ·Έ 타이밍에 맞좰 λΈŒλΌμš°μ €μ— 화면을 κ·Έλ¦¬λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λ‚΄μš©μ„ μ•„λž˜ μ—μ„œ 확인 ν•  수 μžˆλ‹€.
μ΄λ―Έμ§€μ΅œμ ν™” μƒ˜ν”Œ3
Timings μ•„λž˜ 뢀뢄을 ν™•λŒ€ν•΄ λ³΄μ•˜λ‹€. μ• λ‹ˆλ©”μ΄μ…˜μ„ λ³€κ²½λ λ•Œλ§ˆλ‹€ λΈŒλΌμš°μ €μ— λ Œλ”λ§ ν•˜λŠ” 과정을 λ°˜λ³΅ν•˜λŠ” 것을 확인 ν•  수 μžˆλ‹€.
  • βž€ μŠ€νƒ€μΌμ„ λ‹€μ‹œ κ³„μ‚°ν•˜κ³  (dom tree, cssom treeλ₯Ό μƒμ„±ν•˜κ³  λ Œλ” 트리λ₯Ό μƒˆλ‘œ 생성 κ³Όμ •)
  • ➁ λ ˆμ΄μ•„μ›ƒ κ³Όμ •
  • β‘’ 페인트 κ³Όμ •
  • β‘£ λ ˆμ΄μ–΄ ν•©μ„± κ³Όμ •
5번의 경우 점선이 κ·Έμ–΄μ Έ μžˆλŠ”λ° 이 점선은 λΈŒλΌμš°μ € 화면에 λ Œλ”λ§ 화면이 λ…ΈμΆœλ˜μ–΄μ•Ό ν•˜λŠ” μ‹œμ μ΄λ‹€. ν•˜μ§€λ§Œ λ§ˆμ§€λ§‰ λ ˆμ΄μ–΄ 합성과정이 μ™„λ£Œ λ˜μ§€ μ•Šμ€ μƒνƒœλ‘œ 보여 μ§„λ‹€. μœ„μ™€ 같은 ν˜„μƒμ΄ μΌμ–΄λ‚˜λ©΄ ν”„λ ˆμž„μ΄ λ“œλžλ˜κ±°λ‚˜ 쟁크 ν˜„μƒμ΄ μΌμ–΄λ‚˜ μ• λ‹ˆλ©”μ΄μ…˜μ΄ λ§€λ„λŸ½μ§€ μ•Šλ‹€. μ΄λŸ΄λ•ŒλŠ” reflow을 μΌμœΌν‚€λŠ” 속성듀 μ‚¬μš© λ³΄λ‹€λŠ” repaintλ₯Ό μΌμœΌν‚€λŠ” μ†μ„±μ΄λ‚˜ layout, paint 단계λ₯Ό κ±΄λ„ˆλŒμˆ˜ μžˆλŠ” transform 속성을 μ‚¬μš© ν•˜λŠ” 것이 μ’‹λ‹€.

Reflow, Repaintλ₯Ό ν”Όν•˜μ—¬ CSS μ• λ‹ˆλ©”μ΄μ…˜ μ΅œμ ν™”ν•˜κΈ°

.style_ani{
    position: absolute;
    left: 0;
    top: 0;
    width: ${({ width }) => width}%;
    transition: width 1.5s ease;
    height: 100%;
    background: ${({ isSelected }) => isSelected ? 'rgba(126, 198, 81, 0.7)' : 'rgb(198, 198, 198)'};
    z-index: 1;}
μœ„ cssλŠ” width값을 μ΄μš©ν•˜μ—¬ μ• λ‹ˆλ©”μ΄μ…˜μ„ μ μš©ν•˜λŠ” λ¦¬μ•‘νŠΈμ˜ μŠ€νƒ€μΌ μ»΄ν¬λ„ŒνŠΈμ΄λ‹€. 이 λ‚΄μš©μ„ scaleX 속성을 μ΄μš©ν•˜μ—¬ λ³€κ²½ν•˜μ—¬ Reflow, Repaint ν”Όν•˜κ³  GPU 도움 λ°›μ•„ λ Œλ”λ§ ν•˜λ„λ‘ λ³€κ²½ν•œλ‹€.
.style_ani{
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    transform: scaleX(${props => props.width / 100});
    transform-origin: center left;
    transition: width 1.5s ease;
    height: 100%;
    background: ${({ isSelected }) => isSelected ? 'rgba(126, 198, 81, 0.7)' : 'rgb(198, 198, 198)'};
    z-index: 1;
scaleX의 좕은 κ°€μš΄λ°λ₯Ό κΈ°μ€€μœΌλ‘œ μŠ€μΌ€μΌμ΄ λ³€κ²½λ˜κΈ° λ•Œλ¬Έμ— transform-origin 속성을 μΆ”κ°€ν•˜μ—¬ μ„Έλ‘œλŠ” κ°€μš΄λ°λ‘œ κ°€λ‘œλŠ” μ™Όμͺ½μœΌλ‘œ μŠ€μΌ€μΌμ΄ λ³€κ²½ λ˜λ„λ‘ μˆ˜μ •ν•œλ‹€. 또 μ• λ‹ˆλ©”μ΄μ…˜μ΄ transform에 μ μš©λ˜λ„λ‘ transition μ†μ„±μ˜ 값을 transform으둜 λ³€κ²½ν•˜μ—¬ μ€€λ‹€.

μ• λ‹ˆλ©”μ΄μ…˜ Reflowμ—μ„œ GPUμ‚¬μš©μœΌλ‘œ λ³€κ²½ ν›„

μ΄λ―Έμ§€μ΅œμ ν™” μƒ˜ν”Œ4

FPS

μ›Ή λΈŒλΌμš°μ €λŠ” 호좜 μŠ€νƒμ— μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ‘΄μž¬ν•˜λŠ” λ™μ•ˆ, 즉 μ‹€ν–‰ 쀑인 ν•¨μˆ˜κ°€ μ‘΄μž¬ν•˜λŠ” λ™μ•ˆμ—λŠ” 먹톡이 λ˜μ–΄ λ²„λ¦½λ‹ˆλ‹€. λΈŒλΌμš°μ €λŠ” 60 ν”„λ ˆμž„μœΌλ‘œ μ• λ‹ˆλ©”μ΄μ…˜μ„ λ Œλ”λ§ ν•˜κ³  μžˆλŠ”λ° κ·Έλž˜ν”„μ˜ μ• λ‹ˆλ©”μ΄μ…˜μ΄ 뚝뚝 λŠκΈ°λŠ” ν˜„μƒμ€ μ• λ‹ˆλ©”μ΄μ…˜μ„ λ Œλ”λ§ ν•˜λŠ”λ° 60 ν”„λ ˆμž„μ„ λ„˜μ–΄κ°€ ν”„λ ˆμž„ λ“œλ‘­ ν˜„μƒμ΄ λ‚˜νƒ€λ‚˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” μ‚¬μš©μž κ²½ν—˜μ— μ•…μ˜ν–₯을 λ―ΈμΉ  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, λΈŒλΌμš°μ €μ—μ„œ λ™μž‘ν•˜λŠ” JavaScript μ½”λ“œ, 특히 μ‚¬μš©μžμ™€μ˜ μƒν˜Έμž‘μš©μ„ μœ„ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œμ—λŠ” μ½”λ“œμ˜ μ‹€ν–‰ μ‹œκ°„μ΄ μ–Όλ§ˆλ‚˜ 될지λ₯Ό 항상 염두에 두어야 ν•©λ‹ˆλ‹€.
μ΄λ―Έμ§€μ΅œμ ν™” μƒ˜ν”Œ5

Reflow μ˜μ—­μ˜ κ·Έλž˜ν”„

Reflowκ°€ μΌμ–΄λ‚œ μ˜μ—­μ—μ„œλŠ” 보라색과 μ΄ˆλ‘μƒ‰ λ“± 메인 μ“°λ ˆλ“œμ˜ 역할이 맀우 ν™œλ°œν•œ 것을 λ³Ό 수 μžˆλ‹€.
μ΄λ―Έμ§€μ΅œμ ν™” μƒ˜ν”Œ6
좜처 : https://www.inflearn.com/course/lecture?courseSlug=%EC%9B%B9-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94-%EB%A6%AC%EC%95%A1%ED%8A%B8-1&unitId=48065&tab=curriculum