Rendering(Templating)
๐ฆ ์ฐธ๊ณ ํ ๋ฌธ์
- HTML ๊ธฐ์ด - 3 (๋ ๋๋ง์ด๋?) https://velog.io/@ru_bryunak/%EB%A0%8C%EB%8D%94%EB%A7%81%EC%9D%B4%EB%9E%80
- ๋ธ๋ผ์ฐ์ ๋ ๋๋ง์ด ์ด๋ฃจ์ด์ง๋ ๊ณผ์ https://tuhbm.github.io/2017/08/10/rendering1/
- ๋ธ๋ผ์ฐ์ ๋ ์ด๋ป๊ฒ ๋์ํ๋๊ฐ? https://d2.naver.com/helloworld/59361
- CSS ์ ๋๋ฉ์ด์ ์ฑ๋ฅ ๊ฐ์ ๋ฐฉ๋ฒ(reflow ์ต์ํ, will-change ์ฌ์ฉ) https://wit.nts-corp.com/2017/06/05/4571
- MDN web docs - will-change https://developer.mozilla.org/ko/docs/Web/CSS/will-change
๋ ๋๋ง
= ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ ๋๋ ์ด๋ค์ ๋ชจ์๋์ ์ฅ๋ฉด์ธ ์ฌ ํ์ผ(scene file)๋ก๋ถํฐ ์์์ ๋ง๋ค์ด๋ด๋ ๊ณผ์ (์ํค๋ฐฑ๊ณผ)
= ์๋ฒ๋ก๋ถํฐ HTML ํ์ผ์ ๋ฐ์ ํด๋ผ์ด์ธํธ์ ๋ฟ๋ ค์ฃผ๋ ๊ณผ์
๋ ๋๋ง์ด ์งํ๋๋ ์์๋ฅผ ์์๋ณด์.
Source: http://bit.ly/2Okn0fG
- ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ๋ก๋ถํฐ HTML ๋ฌธ์๋ฅผ ๋ฐ๋๋ค. ๋ธ๋ผ์ฐ์ ์
๋ ๋๋ง ์์ง
์ HTML ๋ฌธ์๋ฅผ ํ์ฑํด์ DOM ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ค. - ์ธ๋ถ CSS ํ์ผ๊ณผ ํจ๊ป ํฌํจ๋ ์คํ์ผ ์์๋ฅผ ํ์ฑํ์ฌ CSSOM ํธ๋ฆฌ๋ฅผ ๋ง๋ ๋ค. ์คํ์ผ์ ๋ธ๋ผ์ฐ์ ์ ์์ฒด ์คํ์ผ - ์ฌ์ฉ์ ์ ์ ์คํ์ผ - html ์ ์ธ๋ผ์ธ ์คํ์ผ ์์๋ก ์ฒ๋ฆฌ๋๋ฉฐ, ๋์ค์ ์ฒ๋ฆฌ๋๋ ์คํ์ผ์ ๋ฐ๋ฅธ๋ค.
- ๊ฐ๊ฐ 1, 2์์ ๋ง๋ค์ด์ง DOM ํธ๋ฆฌ์ CSSOM ํธ๋ฆฌ๋ฅผ ๊ฒฐํฉํ์ฌ ๋ ๋๋ง ํธ๋ฆฌ๋ฅผ ํ์ฑํ๋ค. ์ด๋, ํ๋ฉด์ ๋๋ฌ๋์ง ์๋ head ํ๊ทธ๋ display: none; ์ด ํ ๋น๋ ์์๋ ๋ ๋๋ง ํธ๋ฆฌ์ ํฌํจ๋์ง ์๋๋ค.
- ๊ธฐ๊ธฐ์ view port(๊ทธ๋ํฝ์ด ํ์๋๋ ๋ธ๋ผ์ฐ์ ์ ์์ญ) ๋ด์์ ๋
ธ๋๋ค์ ์ ํํ ์์น์ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ๋ ๊ณผ์ ์ด ์งํ๋๋ค. ์ด ๋จ๊ณ๋ฅผ
๋ ์ด์์
๋จ๊ณ ๋๋๋ฆฌํ๋ก์ฐ
๋จ๊ณ๋ผ๊ณ ํ๋ค. ํ์ด์ง์์ ๊ฐ ๊ฐ์ฒด์ ์ ํํ ํฌ๊ธฐ์ ์์น๋ฅผ ํ์ ํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ๋ ๋ ๋๋ง ํธ๋ฆฌ์ ๋ฃจํธ๋ถํฐ ์์ํ์ฌ ๋ ๋๋ง ํธ๋ฆฌ๋ฅผ ์ํํ๋ค. - ๋ ๋๋ง ์์ง์ ํ์ธํธ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์์ผ ๋ ๋๋ง ํธ๋ฆฌ๋ฅผ ํ๋ฉด์ ๊ทธ๋ฆฌ๊ณ , ์ด ๊ณผ์ ์
ํ์ธํ
๋๋๋์คํฐํ
๋ผ๊ณ ํ๋ค. ์์๋ค์ ์์น์ ํฌ๊ธฐ, ์คํ์ผ ๋ฑ์ ๊ณ์ฐ์ด ์๋ฃ๋ ๋ ๋๋ง ํธ๋ฆฌ๋ฅผ ์ด์ฉํด ์ค์ ๊ฐ์ ์ฑ์ ๋ฃ๋๋ค. ์ฌ๊ธฐ์ ๋ธ๋ผ์ฐ์ ๋ ๋ชจ๋ HTML์ ํ์ฑํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ ธ๋ ๋ฐฐ์น์ ๊ทธ๋ฆฌ๊ธฐ ๊ณผ์ ์ ๋์์ ์งํํ๋ค. ์นํ์ด์ง์ ์ ์ํ์ ๋ ํ์ด์ง๊ฐ ํ ๋ฒ์ ๋ค ๋ก๋๋์ง ์๊ณ ๊ฐ ์์๊ฐ ์๊ฐ์ฐจ๋ฅผ ๋๊ณ ๋ก๋๋๋ ๊ฒ์ด ์ด ๋๋ฌธ์ด๋ค.
๋ ๋๋ง์ด ์๋ฃ๋ ์ํ์์ ์ฌ์ฉ์์ ์ธํฐ๋์
์ ์ํด ํ๋ฉด์ ์ผ๋ถ ์์ญ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ฆฌํ๋ก์ฐ
๋๋ ๋ฆฌํ์ธํธ
๊ฐ ๋ฐ์ํ๋ค.
- ๋ ์ด์์์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ
๋ฆฌํ๋ก์ฐ
+๋ฆฌํ์ธํธ
- = DOM ์๋ฆฌ๋จผํธ ์ถ๊ฐ, ์ ๊ฑฐ ๋๋ ๋ณ๊ฒฝ/CSS ์คํ์ผ ์ถ๊ฐ, ์ ๊ฑฐ ๋๋ ๋ณ๊ฒฝ/CSS3 ์ ๋๋ฉ์ด์ ๊ณผ ํธ๋์ง์ /offsetWidth, offsetHeight์ ์ฌ์ฉ/๊ฐ์์ ํ์ hover/ํ ์คํธ ์ ๋ ฅ/์ฐฝ ํฌ๊ธฐ ์กฐ์ ๋ฑ
- ๋ ์ด์์์๋ ๋ณ๊ฒฝ์ด ์์ง๋ง ๊ฐ์์ฑ์๋ ์ํฅ์ ์ฃผ๋ ์์๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ
๋ฆฌํ์ธํธ
= ๊ฐ์ฒด์ ํฌ๊ธฐ์ ์์น๊ฐ ๋ฐ๋์ง ์๊ธฐ ๋๋ฌธ์๋ฆฌํ๋ก์ฐ
๋ ๋ฐ์ํ์ง ์๋๋ค. - = opacity, background-color ๋ฑ
Google์ ๋ฆฌํ๋ก์ฐ ์ต์ํ ๊ฐ์ด๋๋ผ์ธ
- ๋ถํ์ํ DOM ํธ๋ฆฌ ๊น์ด๋ฅผ ์ค์ธ๋ค.
- CSS ๊ท์น์ ์ต์ํํ๊ณ ์ฌ์ฉ๋์ง ์๋ CSS ๊ท์น์ ์ญ์ ํ๋ค.
- ์ ๋๋ฉ์ด์ ๊ณผ ๊ฐ์ด ๋ณต์กํ ๋ ๋๋ง์ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ ํ๋ฆ ๋ฐ์์ ๋ณ๊ฒฝํ๋ค. ๋ณ๊ฒฝํ ๋๋ ์ ๋ ์์น๋ ๊ณ ์ ์์น๋ฅผ ์ฌ์ฉํ๋ค.
- ๋ถํ์ํ๊ณ ๋ณต์กํ CSS ์ ํ์, ํนํ ํ์ ์์ ์ ํ์๋ ์ฌ์ฉํ์ง ์๋๋ค. ์ด ๊ฒฝ์ฐ ์ ํ์๋ฅผ ์ฐพ์๋ด๊ธฐ ์ํด ๋ ๋ง์ CPU ์ฒ๋ฆฌ๋์ด ํ์ํ๋ค.
CSS + JS์์์ ๋ฆฌํ๋ก์ฐ ์ต์ํ ๋ฐฉ๋ฒ
- ์๋ฐ์คํฌ๋ฆฝํธ์์ DOM ๊ฐ์ฒด ํธ์ถ ํ์ ์ค์ด๊ธฐ
let div = document.getElementById('my-div');
// DOM ๊ฐ์ฒด ์ฌ๋ฌ ๋ฒ ์์ => ๋ฆฌํ๋ก์ฐ & ๋ฆฌํ์ธํธ ๊ณผ๋ค ๋ฐ์
div.style.width = '680px';
div.style.height = '360px';
div.style.margin = '35px auto';
let div = document.getElementById('my-div');
// DOM ๊ฐ์ฒด ํ ๋ฒ ์์ => ๋ฆฌํ๋ก์ฐ & ๋ฆฌํ์ธํธ 1๋ฒ๋ง ๋ฐ์
div.style.cssText = 'width: 680px; height: 360px; margin: 35px auto;';
- ์ธ๋ผ์ธ ์คํ์ผ ๋ฐฐ์
- ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ๋ฆฌํ๋ก์ฐ ๋น์ฉ์ ์ค์ผ ์ ์๋ค. ์ธ๋ถ ์คํ์ผ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฆฌํ๋ก์ฐ๊ฐ ํ ๋ฒ๋ง ์ผ์ด๋๋ ๋ฐ๋ฉด, ์ธ๋ผ์ธ ์คํ์ผ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฆฌํ๋ก์ฐ๊ฐ ์ฌ๋ฌ ๋ฒ ๋ฐ์ํ๋ค.
- ํ ์ด๋ธ ๋ ์ด์์ ๋ฐฐ์
- ํ ์ด๋ธ๋ก ๊ตฌ์ฑ๋ ํ์ด์ง ๋ ์ด์์์ ์ ์ง์ ํ์ด์ง ๋ ๋๋ง์ด ์ง์๋์ง ์๊ณ , ๋ชจ๋ ๊ณ์ฐ๋ ํ์์ผ ํ๋ฉด์ ๋ณด์ฌ์ง๋ค.
๊ฐ์ด ๋ณด๋ฉด ์ข์ ๊ธ: https://sculove.github.io/slides/improveBrowserRendering/#/6
์ ๋๋ฉ์ด์
- VSync์ fps
์ ๋๋ฉ์ด์ ์ ์ํ ๋ฆฌํ๋ก์ฐ ์ต์ํ ๋ฐฉ๋ฒ
- ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ฅผ ์ค ๋ position: fixed ๋๋ position: absolute๋ก ์ง์ ํ์ฌ ์ ์ฒด ๋ ธ๋์์ ๋ถ๋ฆฌ
- ์๋ฐ์คํฌ๋ฆฝํธ์ CSS๋ฅผ ํ์ฉํ ์ ๋๋ฉ์ด์ ํจ๊ณผ์๋ ๋ง์ ๋ฆฌํ๋ก์ฐ ๋น์ฉ์ด ๋ฐ์ํ๋๋ฐ, position ์์ฑ์ผ๋ก fixed ๋๋ absolute๋ฅผ ์ฃผ๋ฉด ์ง์ ํ ๋ ธ๋๋ ์ ์ฒด ๋ ธ๋์์ ๋ถ๋ฆฌ๋์ด ํด๋น ๋ ธ๋์ ๋ฆฌํ๋ก์ฐ ๋น์ฉ๋ง ๋ฐ์ํ๊ฒ ๋๋ค.
will-change
์ด์ฉ
๋ธ๋ผ์ฐ์ ๋ ์ด๋ฏธ ๋ชจ๋ ์์์ ๋ํด ์ต์ ํ ์๋๋ฅผ ํ๊ณ ์๋๋ฐ, ๋ธ๋ผ์ฐ์ ๋/* will-change ์์ฑ 4๊ฐ์ง */ will-change: auto; /* ๋ณ๋ค๋ฅธ ์ต์ ํ ์กฐ์น ์์ */ will-change: scroll-position; /* ์คํฌ๋กคํ ๋ ์๋ฆฌ๋จผํธ์ ์์น๊ฐ ๋ฐ๋ ๊ฒ์ ์๊ณ */ will-change: contents; /* ์๋ฆฌ๋จผํธ์ ์ปจํ ์ธ ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒ์ ์๊ณ */ will-change: transform; /* ๋ณ๊ฒฝํ๊ณ ์ถ์ ์์ฑ์ ์ฌ์ฉํ ์ ์์. ํฌ๋กฌ์์๋ opacity, transform, top, left, right, bottom์ 6๊ฐ์ง๋ง ์ง์ */
will-change
์์ฑ์ด ์ฌ์ฉ๋ ์์์๋ ํน๋ณํ ๋ ๋ง์ ์์์ ์๋ชจํ์ฌ ์ต์ ํ๋ฅผ ํ๋ค. ๊ทธ๋ฌ๋ฏ๋กwill-change
๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ ์คํ๋ ค ์ฑ๋ฅ์ ๋ ๋ฎ์ถ ์๋ ์๋ค.var el = document.getElementById('element'); // ์์๊ฐ hover ์ํ์ผ ๋ will-change ์ค์ el.addEventListener('mouseenter', hintBrowser); el.addEventListener('animationEnd', removeHint); function hintBrowser() { // ์ ๋๋ฉ์ด์ ํคํ๋ ์ ๋จ๋ฝ ๋ด์์ // ๋ณ๊ฒฝ๋ ์์ ์ธ ์ต์ ํ ๊ฐ๋ฅํ ์์ฑ๋ค this.style.willChange = 'transform, opacity'; } function removeHint() { this.style.willChange = 'auto'; }
- ์ฌ๋ผ์ด๋์ฒ๋ผ ์ฃผ๊ธฐ๊ฐ ์งง๊ณ ๋ณํ๊ฐ ํ์คํ ์๊ณ ๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ์ ๋๋ฉ์ด์
๋์์ด ๋๋ ๋ค์ ๊ธฐ๋ณธ ์ํ(
will-change: auto
)๋ก ๋๋๋ ค์ผ ํ๋ค. ์ต์ ํ๋ฅผ ์๋ํ๋ฉด ๋น์ฉ์ด ๋ฐ์ํ๋๋ฐ,will-change
์ ๊ฒฝ์ฐ๋ ์ต์ ํ๋ฅผ ๊ธธ๊ฒ ์ ์ง์ํค๊ธฐ ๋๋ฌธ์ด๋ค. will-change
์์ฑ์ ํตํด ๋ณํ๊ฐ ์์๋๋ ์์๋ฅผ ๋ธ๋ผ์ฐ์ ์๊ฒ ๋ฏธ๋ฆฌ ์๋ ค์ค์ผ๋ก์จ ๋ณํ๊ฐ ์ผ์ด๋๊ธฐ ์ ์ ์ ์ ํ ์ต์ ํ ์กฐ์น๋ฅผ ์ทจํ๋ค.
๋ ๋๋ง ์์ง
'Development > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
2022 ๋์์ธ ์์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ 11๊ฐ ์ฐ๋จน ํ๊ธฐ (1) | 2022.10.29 |
---|---|
shouldComponentUpdate()์ React.PureComponent (2) | 2021.01.29 |