์ต๊ทผ ํ์ฌ์์ ์๋ก์ด ์๋น์ค(๋ชจ๋ฐ์ผ์ธ๋ฑ์ค GAME) ๋ฅผ ์ถ์ํ๋ฉด์ ์ฒ์์ผ๋ก ์๋น์ค์ 1์ธ๋ถ์ผ๋ก ๊ธฐ์ฌํ๊ฒ๋์๋ค...(์๋ง?? ๋๋์ด ๋ง 2๋ 2๊ฐ์๋ง์๐ฅน)
์ฐ๋ฆฌ ํ์ ํน์ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ์ง์ํ๊ณ ์ง์ ๋ง๋ค์ด๋ณด์ ์ธ๋ฐ, ๊ทธ์ค์์ ์๋น์ค์ ํน์ง์ธ ๋ฐ์ดํฐ ์๊ฐํ์ ๋ง์ ์ด์ ์ ๋ง์ถฐ์ ธ์๋ค.
์๋น์ค ์ถ์ ์ผ์ ์ด ์ด๋ฐํด ๊ธฐ์กด์ ๊ฐ๋ฐ๋์๋ ์ฝ๋๋ค์ ์ฐธ๊ณ ํ๋ฉด์ ์ฐจํธ๋ฅผ ๊ทธ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ธ ์ง์๊ณผ ๋ก์ง์ ํ์ ํ๊ณ ๋ฐ๋ผ๊ฐ๋ฉด ๋ง๋ค์๋ค. ๋๋ฆ ๋๋ง์ ๋ฐฉ์์ ์์ด์ ๋๋ง์ ์ฐจํธ๋ฅผ ๋ง๋ค๋ ค๊ณ ๋ ธ๋ ฅํ๋ค.
์ ์ ์๋ ์๋น์ค ๊ฐ๋ฐ ๊ธฐ๊ฐํ ๋ฐ๋ก ๋ค๋ฅธ ํ์ ์์ฒญ์ ๋ฐ์ ์์ฐ์ฉ ํ์ด์ง๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค. ๋ค๋ฅธ ํ์์ด ๋ฉ์ธ์ ์ก๊ณ ๊ณ์ จ๊ณ ์ด๋ฒ ํ์ ์์ ์ง๋๋ฒ ๊ฐ๋ฐ๋ ๋ชปํ๋ ๋ค๋ฅธ ์ฐจํธ๋ค์ ๋ง์๊ป ๋ง๋ค์ด๋ณด๋ผ๊ณ ํด์ฃผ์ จ๋ค.
๊ทธ๋์ ๊ธฐ์กด ํ์์ ๋ง๋ค์๋ ์ฐจํธ๋ฅผ ๋ฒ์ด๋ ์ฌ๋๋ค์ด ๋ง์ด ์ฌ์ฉํ๋ ์ฐจํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒ์ํ๊ณ ๊ฐ๋ฐ์ ๋๊ตฌ๋ก ํ๋ํ๋ ๋ถ์ํ๋ฉด์ ๋์์ธ๋ ํ๊ณ ๊ธฐ๋ฅ๋ ๊ตฌํํ๋ฉด์ ์ง์ง ๋๋ง์ ์ฐจํธ๋ฅผ ๋ง๋ค๊ธฐ์ํด ๋ ธ๋ ฅํ๋ค.
๊ทธ๋ฌ๋ ์ค!!! ํ๋ ๊ธฐ์ต๋จ๋ ์ ์ ์ฐจํธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ํดํ์ ์ด๋๋ฐฉ์์ด์๋ค.
const isPassHalfWidth = (refSize.width / 2) < toolTip.x;
const isPassHalfHeight = (refSize.height / 2) < toolTip.y;
const passHalfStyle = (isPassHalfHeight && isPassHalfWidth) ? `translate(-100%,-100%)` :
isPassHalfWidth ? `translateX(-100%)` : isPassHalfHeight ? `translateY(-100%)` : '';
...
<div className={styels.tooltip}>
style={{
transform: passHalfStyle,
left: toolTip.x - 1,
top: toolTip.y,
}}
</div>
const isPassHalfWidth = (refSize.width / 2) < toolTip.x;
const isPassHalfHeight = (refSize.height / 2) < toolTip.y;
const tooltipX = isPassHalfWidth ? `calc(${toolTip.x}px - 100% - 1rem)` : `calc(${toolTip.x}px + 1rem)`;
const tooltipY = isPassHalfHeight ? `calc(${toolTip.y}px - 100%)` : `${toolTip.y}px`;
...
<div className={styels.tooltip}>
style={{
left: 0,
top: 0,
transform: `translate(${tooltipX},${tooltipY})`
}}
</div>
์ด์ ์ ์์ฑํ๋ ๋ฐฉ์์ tooltip์ posistion์ด absolute์ธ๊ฑด ๊ฐ์ง๋ง ์ด๋ํ๋ ๋ฐฉ๋ฒ์ด ๋ฌ๋๋ค.
์ด์ ์๋ left,top
ํ์์ ํ์ฉํ์ฌ ๋งค๋ฒ ์์น๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ๊ณ์ฐํ๋ ๋ฐฉ์์ด์๋ค. ์ผ๋จ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ๋๋ ๊ตฌํํ๋๊ฒ ๋ชฉํ์ด๊ธฐ ๋๋ฌธ์ ์๋ํ ๋๋ก ์ ์์ง์ด๋์ง๊ฐ ์ค์ํ๋๊ฑฐ ๊ฐ๋ค.
ํ์ง๋ง ์ด๋ฒ์ ์ฐพ์ ๋ฐฉ์์ transform
์ ์ฌ์ฉํ ๋ฐฉ๋ฒ์ด์๋ค. ์ฒจ์๋ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๋ฐฉ์์ ์๊ณ "์ ๋ฐํ๋ฐ??"๋ผ๊ณ ์๊ฐํ์๋ค. ์ต๊ทผ์ ๋ค์ ๊ธฐ์ด๋ถํฐ ๊ณต๋ถํ๋ฉด์ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง์ ๋ํด ๋ค์ ๊ณต๋ถํ๋ฉด์ ์ฑ๋ฅ ์ต์ ํ์ ์ค์์ฑ์ ๋๋ผ๊ฒ๋์๋ค.!
์ฌ์ค ์ฐจํธ๋ฅผ ๊ทธ๋ฆฌ๋ฉด์ ๋๋ฌด ๋ง์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ๊ณ์ฐํ๋ค๋ณด๋ ์ฑ๋ฅ์ด ์ข์ง ์์๊บผ ๊ฐ๋ค ๋ผ๋ ๋๋์ ์์์ง๋ง ์ค์ ๋ก ์ฑ๋ฅ ๊ฐ์ ์ ์ํด ์ด๋ค๊ฑธ ํด์ผํ ์ง ๊ฐ์ด ์ค์ง ์์์๋ค.
์ด๋ฒ ๊ณ๊ธฐ๋ก ๋ ๋๋ง ๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์งํํ๋ฉด์ ๋์ค์ javascript๋ ์์ ํ๋ฉด ๋ฒ๋ค ์ฌ์ด์ฆ๋ ์ค์ด๊ณ Lighthouse์์๋ ๋์ ์ ์๋ฅผ ๋ฐ๊ณ ์ถ๋ค. ใ ใ ใ ๐
ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ๋ ๋ฉํฐ ํ๋ก์ธ์ ์ํคํ ์ฒ๋ก ๋์์ ํ๋ค.
๋ ๋๋ฌ ํ๋ก์ธ์ค๋ ์น ํ์ด์ง๋ฅผ ํ์ํ๋ ์ฌ๋ฌ ๋จ๊ณ๋ฅผ ๋งก์์ ์งํํ๋๋ฐ, ๊ทธ ์ค ๋ ์ด์์
๊ณผ ํ์ธํธ
๋ ์ค์ํ ๊ณผ์ ์ด๋ค.
๋ ์ด์์์ RenderTree๋ฅผ ์ฐธ๊ณ ํ์ฌ HTML ์์์ ํฌ๊ธฐ์ ์์น๋ฅผ ๊ฒฐ์ ํ๋ค. CSS ์ ๋ณด๋ ์ฐธ๊ณ ํ์ฌ ์ด๋์ ์์นํ ์ง ๊ณ์ฐํ๊ณ ํฌ๊ธฐ,์์น,๊ฐ๊ฒฉ ๋ฑ์ด ๊ฒฐ์ ๋๋ค.
ํ์ธํธ๋ ์ค์ ๋ก ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ๋จ๊ณ๋ก ๊ฒ์ฐ๋ ์์น์ ํฌ๊ธฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์๋ค์ ํ๋ฉด์ ํ์ํ๋ค.
์ฌ๊ธฐ์ left,top์ ๋ ์ด์์์ ๋ค์ ๊ทธ๋ฆฌ๋ reflow์ ๋ํ์ ์ธ ์์๋ก ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ธ๋ผ์ฐ์ ๋ ๋ ์ด์์์ ๋ณ๊ฒฝํ๋ค. ์ด๋ง์ ์ฆ, ์์์ ์์น๋ฅผ ๋ค์ ๊ณ์ฐํ๊ณ ํ์ธํธ ํ๋ค๋ ์๋ฏธ์ด๋ค. ์ด๋ฐ ๊ณผ์ ์ ์ฃผ๋ก CPU์์ ์งํ์ ํ๋ค.
ํ์ง๋ง transform, opacity์ ๊ฐ์ ์์ฑ์ composite ๋จ๊ณ๋ก ์ฃผ๋ก GPU๊ฐ ์์ ์ ์ํํ๋ค.
CPU์ GPUํน์ง์ ๋ณด๊ธฐ ํธํ๊ฒ ์ ๋ฆฌํ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๊ฐ ํน์ง์ ์ฝ๊ฒ ์ดํดํ ์ ์๋ค.๐
GPU๋ ๋ณ๋ ฌ ์์ ์ ์ต์ ํ๋์ด ์์ผ๋ฉฐ ํ๋์จ์ด๋ฅผ ๊ฐ์ํ ํ๊ณ ๋ ์ด์ด์ ํฉ์ฑ์ด ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๊ฒ ํด์ค๋ค.
CPU๋ ์นํ์ด์ง์ HTML,CSS,Javascipt ๋ฑ์ ์ฝ๋๋ฅผ ํด์ํ๊ณ ์คํํ๋ ์ญํ ์ ๋ด๋นํ๋ค. ๋ณต์กํ javascript ์ฐ์ฐ์ด ์๋ค๋ฉด ์ ๋๋ฉ์ด์ ์ด ๋๊ธฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์๊ณ ์ฐ์์ ์ผ๋ก ์ฌ์ฉ์ ๊ฒฝํ์ด ๋๋น ์ง๊ฒ ๋๋ค.
๋ง์ ์์ GPU์ ๋งก๊ธฐ๊ฒ ๋๋ฉด ๊ทธ๊ฒ ๋ํ GPU์ ๊ณผ๋ถํ๋ฅผ ๋ถ๋ฌ์ผ์ผํค๊ฒ ๋ฉ๋ชจ๋ฆฌ ๋ฆฌ์์ค๊ฐ ๊ณ ๊ฐ ๋ ์ ์๋ค.
๊ฐ์ ์ ๋๋ฉ์ด์ ์ ๊ฐ์ ms ๋์ ์ฌ์ฐํ์ฌ ์ธก์ ํ ๊ฒฐ๊ณผ์ด๋ค.
์ต์ ํ ์ ์๋ ๋ ์ด์์ ๋ณ๊ฒฝ์ ๋ํ๋ด๋ ๋ถํ์ ๋ค๋ชจ๊ฐ ๋ณด์ด๊ณ , event log์ layout์ ๊ฒ์ํ๋ฉด reflow๊ฐ ๋ฐ์ํ๊ณ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์ต์ ํ ํ์๋ ๋ถํ์ ๋ค๋ชจ๋ ๋ณด์ด์ง์๊ณ event log์ layout์ ๊ฒ์ํด๋ ๊ฒ์๊ฒฐ๊ณผ์ ๋ณด์ด์ง ์๋๋ค.
ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์ฑ๋ฅ ๋ถ์ ๋๊ตฌ ์ค FPS๋ฅผ ํ์ธ ํ ์ ์๋ ๋๊ตฌ๊ฐ ์๋ค. ๋ง์ฐ์ค๋ฅผ ์์ง์ด๋ ์ด๋น ์ ๋๋ฉ์ด์ ํ๋ ์๊ณผ GPU ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ์ธ ํ ์์๋ค.
ํ๋จ GPU๋ฅผ ๋ณด๊ฒ ๋ณด๋ฉด ์ต์ ํ ์ ์ ๋๋ต 20.5MB์ GPU๋ฅผ ์ฌ์ฉํ์ง๋ง ์ต์ ํ ํ GPU๋ 17.2MB๋ฅผ ์ฌ์ฉํ๋ค.
ํ์ฌ์ ๋ค๋๋ค๋ณด๋ฉด ์ฝ๋์ ํ๋ฆฌํฐ๊ฐ ์์ฝ๋๋ผ๋ ๊ธฐํ์ ๋ง์ถฐ ์์ ์ ํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๋น์ง๋์ค๋ฅผ ์ํด์๋ ๋น์ฐํ ๊ณ ๋ คํด์ผ ํ๋ ๋ถ๋ถ์ด๊ณ ๊ฐ์ํด์ผ ํ๋ ๋ถ๋ถ์ด๋ผ๊ณ ์๊ฐํ๋ค.
ํ์ง๋ง ์ฅ๊ธฐ์ ์ผ๋ก ํ๋ฌ๋ํธ๋ฅผ ๋ณด๋ฉด ์ ์ง๋ณด์๋ฅผ ์ํด์๋ ์ฌ์ฉ์๋ฅผ ์ํด์๋ ๋ ์์ ์ ์ํด์๋ ์ฝ๋๋ฅผ ๋ถ์ํ๊ณ ๊ฐ์ ํด๋๊ฐ๋ ๊ณผ์ ์ด ํ์ํ๋ค๊ณ ์๊ฐํ๋ค. ์ง๊ธ๊น์ง ์ฌ์ฉ์๊ฐ ์ฌ๋ด ์์ฃผ์ ํ๋ก์ ํธ๋ฅผ ์ฃผ๋ก ํ์๋๋ฐ ์ค์ ๋ก ์ธ๋ถ ์ด์ฉ์๊ฐ ์๋ ์์ ์ ํ๋ ๋๊ปด์ง ๋ถ๋ถ์ด ๋ง์๋ค. ์์ง ๋ถ์กฑํ ๋ถ๋ถ์ด ๋ง์ง๋ง ์ฐจ๊ทผ์ฐจ๊ทผ ๋ ๊ฐ์ ํด์ผ๊ฒ ๋ค๋ ์์ง๋ฅผ ๊ฐ์ง๊ฒ ๋์๋ค!!!
๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ ํ ์ ์๋ ๋ถ๋ถ์ ์ฐพ๊ฒ ๋๋ฉด ๋ ๊ธ์ ์ฐ๋๋ก ํ๊ฒ ์ต๋๋ค ใ ใ ๐ฝ๐ฝ