μ μκΆ
μ΄ κΈμ μλ¬Έμ λ€μκ³Ό κ°μ μ μκΆ κΈ°μ€μ λ°λ¦ λλ€.
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 3.0 License, and code samples are licensed under the Apache 2.0 License. For details, see our Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
https://developers.google.com/web/updates/2018/09/inside-browser-part1
λ λλ¬ νλ‘μΈμ€λ ν λ΄λΆμμ λ°μνλ λͺ¨λ μμ μ λ΄λΉνλ€
λ λλ¬ νλ‘μΈμ€μ λ©μΈ μ€λ λκ° λΈλΌμ°μ λ‘ μ μ‘λ λλΆλΆμ μ½λλ₯Ό μ²λ¦¬νλ€
κ°νΉ μΉ μ컀λ μλΉμ€ μ컀λ₯Ό μ¬μ©νλ κ²½μ°μλ μ컀 μ€λ λκ° μλ°μ€ν¬λ¦½νΈ μ½λμ μΌλΆλ₯Ό μ²λ¦¬νλ€
μΉ νμ΄μ§λ₯Ό ν¨μ¨μ μΌκ³ λΆλλ½κ² λ λλ§νκΈ° μν΄ λ³λμ μ»΄ν¬μ§ν° μ€λ λμ λμ€ν° μ€λ λκ° λ λλ¬ νλ‘μΈμ€μμ μ€νλλ€
λ λλ¬ νλ‘μΈμ€μ μ£Όμ μν μ HTML, CSS, JavaScriptλ₯Ό μ¬μ©μμ μνΈμμ©μ ν μ μλ μΉ νμ΄μ§λ‘ λ³ννλ κ²μ΄λ€
νμ΄μ§λ₯Ό μ΄λνλ λ΄λΉκ²μ΄μ μ€ν λ©μμ§λ₯Ό λ λλ¬ νλ‘μΈμ€κ° λ°κ³ HTML λ°μ΄ν°λ₯Ό μμ νκΈ° μμνλ©΄ λ λλ¬ νλ‘μΈμ€μ λ©μΈ μ€λ λλ λ¬Έμμ΄(HTML)μ νμ±ν΄μ DOM(document object model)μΌλ‘ λ³ννκΈ° μμνλ€
DOMμ λΈλΌμ°μ κ° λ΄λΆμ μΌλ‘ μΉ νμ΄μ§λ₯Ό νννλ λ°©λ²μΌ λΏλ§ μλλΌ μΉ κ°λ°μκ° JavaScriptλ₯Ό ν΅ν΄ μνΈμμ©μ ν μ μλ λ°μ΄ν° ꡬ쑰μ΄μ APIμ΄λ€
HTML λ¬Έμλ₯Ό DOMμΌλ‘ νμ±νλ λ°©λ²μ HTML νμ€μ μ μλμ΄ μλ€
λΈλΌμ°μ μμ HTML λ¬Έμλ₯Ό μ΄μμ λ μ€λ₯λ₯Ό λ°νλ°μ μ μ΄ μμμ κ²μ΄λ€
HTMLμ λ«λ νκ·Έκ° λλ½λμ΄λ μ ν¨ν HTMLμ΄λ€
μ€λ₯λ₯Ό μ°μνκ² μ²λ¦¬νλλ‘ HTML λͺ
μΈκ° μ€κ³λμκΈ° λλ¬Έμ΄λ€
νμμ μ€λ₯ μ²λ¦¬ κ°μμ μ¬λ‘
μΉ μ¬μ΄νΈλ μΌλ°μ μΌλ‘ μ΄λ―Έμ§, CSS, JavaScriptμ κ°μ μΈλΆ 리μμ€λ₯Ό μ¬μ©νλ€
μ΄λ¬ν νμΌμ λ€νΈμν¬λ μΊμμμ λ‘λ©ν΄μΌ νλ€
DOMμ ꡬμΆνκΈ° μν΄ νμ±νλ λμ μ΄λ° 리μμ€λ₯Ό λ§λ λλ§λ€ νλνλ μμ²ν μλ μμ κ²μ΄λ€
νμ§λ§ μλλ₯Ό λμ΄κΈ° μν΄ ν리λ‘λ(Preload) μ€μΊλκ° λμμ μ€νλλ€
HTML λ¬Έμμ <img>
λλ <link>
μ κ°μ νκ·Έκ° μμΌλ©΄ ν리λ‘λ μ€μΊλλ HTML νμκ° μμ±ν ν ν°μ νμΈνκ³ λΈλΌμ°μ νλ‘μΈμ€μ λ€νΈμν¬ μ€λ λμ μμ²μ 보λΈλ€
<script>
νκ·Έλ₯Ό λ§λλ©΄ HTML νμλ HTML λ¬Έμμ νμ±μ μΌμ μ€μ§ν λ€μ JavaScript μ½λλ₯Ό λ‘λ©νκ³ νμ±ν΄ μ€νν΄μΌ νλ€
μλνλ©΄ JavaScriptλ DOM ꡬ쑰 μ 체λ₯Ό λ°κΏ μ μλ document.write()
λ©μλμ κ°μ κ²μ μ¬μ©ν΄ λ¬Έμμ λͺ¨μμ λ³κ²½ν μ μκΈ° λλ¬Έμ΄λ€
νμ± λͺ¨λΈ κ°μ
HTML νμ±μ μ¬κ°νκΈ°μ μ HTML νμλ JavaScriptμ μ€νμ΄ λλκΈ°λ₯Ό κΈ°λ€λ €μΌ νλ€
μλ°μ€ν¬λ¦½νΈ μμ§μ κΈ°λ³Έ
μΉ κ°λ°μκ° λΈλΌμ°μ μ 리μμ€ λ‘λ©μ λν ννΈλ₯Ό 보λ΄λ λ°©λ²μλ μ¬λ¬κ°μ§κ° μλ€
JavaScriptμμ document.write() λ©μλλ₯Ό μ¬μ©νμ§ μλλ€λ©΄ <script>
νκ·Έμ asyncμμ±μ΄λ deferμμ±μ μΆκ° ν μ μλ€
μ΄ μμ±μ΄ μμΌλ©΄ λΈλΌμ°μ κ° JavaScript μ½λλ₯Ό λΉλκΈ°μ μΌλ‘ λ‘λ©νκ³ μ€ννλ©΄μ HTML νμ±μ λ§μ§ μλλ€
JavaScript λͺ¨λμ μ¬μ©ν μλ μλ€
<link rel="preload">
λ νμ¬ λ΄λΉκ²μ΄μ
μ μ€ννκΈ° μν΄ λ¦¬μμ€κ° λ°λμ νμνλ€λ κ²μ λΈλΌμ°μ μκ² μλ €μ 리μμ€λ₯Ό κ°λ₯ν 빨리 λ€μ΄λ‘λνλ €λ κ²½μ°μ μ¬μ©ν μ μλ€
λΉ λ₯Έ λ‘λ λ°©λ²
DOMλ§μΌλ‘λ μΉ νμ΄μ§μ λͺ¨μμ μ μ μλ€. CSSλ‘ μΉ νμ΄μ§ μμμ λͺ¨μμ κ²°μ ν μ μκΈ° λλ¬Έμ΄λ€
λ©μΈ μ€λ λλ CSSλ₯Ό νμ±νκ³ κ° DOM λ
Έλμ ν΄λΉλλ κ³μ°λ μ€νμΌ(computed style)μ νμ νλ€
κ³μ°λ μ€νμΌμ CSS μ νμλ‘ κ΅¬λΆλλ μμμ μ μ©λ μ€νμΌμ κ΄ν μ 보μ΄λ€
CSSλ₯Ό μ ν μμ©νμ§ μμλ DOM λ
Έλμλ κ³μ°λ μ€νμΌμ΄ μ μ©λμ΄ μλ€
<h1>
νκ·Έλ <h2>
νκ·Έλ³΄λ€ ν¬κ² νμλλ©° λ°κΉ₯ μ¬λ°±(margin)μ΄ λͺ¨λ μμμ μ μ©λλ€
λΈλΌμ°μ μ κΈ°λ³Έ μ€νμΌ μνΈκ° μκΈ° λλ¬Έμ΄λ€
Chormium μμ€ μ½λμ html,cssνμΌμ 보면 Chormeμ κΈ°λ³Έ CSSκ° μ΄λ€μ§ μ μ μλ€
μ΄μ λ λλ¬ νλ‘μΈμ€κ° λ¬Έμμ ꡬ쑰μ κ° λ
Έλμ μ€νμΌμ μμ§λ§ νμ΄μ§λ₯Ό λ λλ§νκΈ°μλ μΆ©λΆνμ§ μλ€
μ ν ν΅νλ₯Ό νλ©° μΉκ΅¬μκ² κ·Έλ¦Όμ μ€λͺ
νλ€κ³ μκ°νλ©΄ μ΄ν΄νκΈ° μ½λ€
컀λ€λ λΉ¨κ°μ μμ΄ μκ³ μμ νλμ μ¬κ°νμ΄ μλ€κ³ λ§νλ©΄ μΉκ΅¬λ κ·Έλ¦Όμ΄ μ΄λ»κ² μκ²Όλμ§ μ νν μ μ μλ€
λ μ΄μμμ μμμ κΈ°ννμ μμ±μ μ°Ύλ κ³Όμ μ΄λ€
λ©μΈ μ€λ λλ DOMκ³Ό κ³μ°λ μ€νμΌμ νμ΄κ°λ©° λ μ΄μμ νΈλ¦¬λ₯Ό λ§λ λ€
λ μ΄μμ νΈλ¦¬λ x,y μ’ν, λ°μ€ μμμ ν¬κΈ°μ κ°μ μ 보λ₯Ό κ°μ§κ³ μλ€
λ μ΄μμ νΈλ¦¬λ DOM νΈλ¦¬μ λΉμ·ν κ΅¬μ‘°μΌ μ μμ§λ§ μΉ νμ΄μ§μ 보μ΄λ μμμ κ΄λ ¨λ μ λ³΄λ§ κ°μ§κ³ μλ€
display: nome μμ±μ΄ μ μ©λ μμλ λ μ΄μμ νΈλ¦¬μ ν¬ν¨λμ§ μλλ€ (κ·Έλ¬λ visibility: hidden μμ±μ΄ μ μ©λ μμλ λ μ΄μμ νΈλ¦¬μ ν¬ν¨λλ€)
μ΄μ λΉμ·νκ² p::before{content: "hola"} μμ±κ³Ό κ°μ μμ¬ ν΄λμ€ (pseudo class)μ μ½ν
μΈ λ DOMμλ ν¬ν¨λμ§ μμ§λ§ λ μ΄μμ νΈλ¦¬μλ ν¬ν¨λλ€
μΉ νμ΄μ§μ λ μ΄μμμ κ²°μ νλ κ²μ μ΄λ €μ΄ μμ
μ΄λ€. κ°μ₯ λ¨μνκ² μμμ μλλ‘ νΌμ³μ§λ λΈλ‘ μμ νλλ§ μλ μΉ νμ΄μ§μ λ μ΄μμμ κ²°μ ν λμλ ν°νΈμ ν¬κΈ°κ° μΌλ§μ΄κ³ μ€ λ°κΏμ μ΄λμ ν΄μΌ νλμ§ κ³ λ €ν΄μΌ νλ€
λ¨λ½μ ν¬κΈ°μ λͺ¨μμ΄ λ°λ μ μκ³ , λ€μ λ¨λ½μ μμΉμ μν₯μ΄ μκΈ° λλ¬Έμ΄λ€
CSSλ μμλ₯Ό νμͺ½μΌλ‘ νλ¦¬κ² νκ±°λ ν¬κΈ°μ λ²μ΄λ λΆλΆμ 보μ΄μ§ μκ² νκ±°λ κΈμ΄ μ°μ΄λ λ°©ν₯μ λ³κ²½ν μ μλ€
λ μ΄μμ λ¨κ³κ° μμ²λ μ무λ₯Ό λ§‘κ³ μλ€λ κ²μ μ μ μλ€
Chromeμμλ ν νμ΄ λ μ΄μμμ μ λ΄νκ³ μλ€κ³ νλ€
νμ±, μ€νμΌ κ³μ°, λ μ΄μμμ κ΄ν λ μμΈν λ΄μ©μ λΈλΌμ°μ λ μ΄λ»κ² μλνλκ°
μμ£Ό
λ μ΄μμ νΈλ¦¬μ λ€μμ μ€λͺ ν νμΈνΈ νΈλ¦¬ μ¬μ΄μ νκ°μ§ μμ μ΄ μλ€
λ μ΄μμ νΈλ¦¬λ₯Ό μννλ©΄μ μμ± νΈλ¦¬ (property tree)λ₯Ό λ§λλ μμ μ΄λ€
μμ± νΈλ¦¬λ clip, transform, opacityλ±μ μμ± μ λ³΄λ§ κ°μ§κ³ μλ νΈλ¦¬μ΄λ€
κΈ°μ‘΄μλ μ΄λ° μ 보λ₯Ό λΆλ¦¬νμ§ μκ³ λ Έλλ§ κ°μ§κ³ μμλ€
κ·Έλμ νΉμ λ Έλμ μμ±μ΄ λ³κ²½λλ©΄ ν΄λΉ λ Έλμ νμ λ Έλμλ μ΄ κ°μ λ€μ λ°μνλ©΄μ λ Έλλ₯Ό μνν΄μΌ νλ€
μ΅μ Chormeμμλ μ΄λ° μμ±λ§ λ³λλ‘ κ΄λ¦¬νκ³ κ° λ Έλμμλ μμ± νΈλ¦¬μ λ Έλλ₯Ό μ°Έμ‘°νλ λ°©μμΌλ‘ λ³κ²½λκ³ μλ€
DOM, μ€νμΌ, λ μ΄μμμ κ°μ§κ³ λ μ¬μ ν νμ΄μ§λ₯Ό λ λλ§ ν μλ μλ€
λͺ¨μ, μμΉλ₯Ό μλλΌλ μ΄λ€ μμλ‘ κ·Έλ €μΌ ν μ§ νλ¨ν΄μΌ νλ€
μλ₯Ό λ€μ΄ μ΄λ€ μμμ z-index μμ±μ΄ μ μ©λμ΄μλ€λ©΄ HTMLμ μμ±λ μμλ‘ μμλ₯Ό 그리면 μλͺ» λ λλ§λ νλ©΄μ΄ λμ¨λ€
μ¦, DOMμ μ μΈλ λ Έλ μμμ νμΈνΈ μμλ λ§μ΄ λ€λ₯Ό μ μλ€
νμΈνΈ λ¨κ³μμ λ©μΈ μ€λ λλ νμΈνΈ κΈ°λ‘μ μμ±νκΈ° μν΄ λ μ΄μμ νΈλ¦¬λ₯Ό μννλ€
νμΈνΈ κΈ°λ‘μ "λ°°κ²½ λ¨Όμ , λ€μμ ν
μ€νΈ κ·Έλ¦¬κ³ μ§μ¬κ°ν"κ³Ό κ°μ νμΈν
κ³Όμ μ κΈ°λ‘ν κ²μ΄λ€
λ λλ§ νμ΄ν λΌμΈμμ νμ
ν΄μΌ ν κ°μ₯ μ€μν μ μ κ° λ¨κ³μμ μ΄μ μμ
μ κ²°κ³Όκ° μ λ°μ΄ν°λ₯Ό λ§λλλ° μ¬μ©λλ€λ κ²μ΄λ€
μλ₯Ό λ€μ΄ λ μ΄μμ νΈλ¦¬μμ λ³κ²½μ΄ μ겨 λ¬Έμμ μΌλΆκ° μν₯μ λ°μΌλ©΄ νμΈν
μμλ μλ‘ μμ±ν΄μΌ νλ€
μμμ μ λλ©μ΄μ
μ μ μ©νλ©΄ λΈλΌμ°μ λ λͺ¨λ νλ μμμ μ΄λ¬ν μμ
μ ν΄μΌ νλ€
λλΆλΆμ λμ€νλ μ΄ μ₯μΉλ νλ©΄μ μ΄λΉ 60λ² μλ‘ κ³ μΉλ€ (60fps)
μμμ μμ§μμ΄ λͺ¨λ νλ μμ λ°μλμ΄μΌ μ¬λμ΄ λ³Ό λ λΆλλ½κ² λκ»΄μ§λ€
μ λλ©μ΄μ
μμ νλ‘μ μ΄ λλ½λλ©΄ μΉ νμ΄μ§ λ²λ²
λλ (janky) κ²μ²λΌ 보μΈλ€
νλ©΄ μ£Όμ¬μ¨μ λ§μΆμ΄ λ λλ§ μμ
μ΄ μ루μ΄μ Έλ μ΄ μμ
μ λ©μΈ μ€λ λμμ μ€νλκΈ° λλ¬Έμ μ ν리μΌμ΄μ
μ΄ JavaScriptλ₯Ό μ€ννλ λμ λ λλ§μ΄ λ§ν μ μλ€
JavaScript μμ
μ μμ λ©μ΄λ¦¬λ‘ λλκ³ requestAnimationFrame() λ©μλλ₯Ό μ¬μ©ν΄ νλ μλ§λ€ μ€ννλλ‘ μ€μΌμ€μ κ΄λ¦¬ν μ μλ€
μλ°μ€ν¬λ¦½νΈ μ€νμ΅μ ν
λ©μΈ μ€λ λλ₯Ό λ§μ§ μκΈ° μν΄ μΉ μ컀μμ JavaScriptλ₯Ό μ€νν μ μλ€
requestAnimationFrame() λ©μλλ₯Ό ν΅ν΄ λ±λ‘ν μ½λ°± ν¨μλ λ° κ·Έλ¦Όκ³Ό κ°μ΄ νλ μλ§λ€ μ€νλλ€. νλ μ κ°κ²©μ λͺ¨λν°μ μ£Όμ¬μ¨μ λ°λΌ λ€λ₯Ό μ μλ€
λΈλΌμ°μ λ VSync μκ·Έλλ‘ νλ μ κ°κ²©μ νμ νλ€
λΈλΌμ°μ μ VSync νμ©
λΈλΌμ°μ λ λ¬Έμμ ꡬ쑰μ κ° μμμ μ€νμΌ, μμμ κΈ°ννμ μμ±, νμΈνΈ μμλ₯Ό μκ³ μλ€
λΈλΌμ°μ λ μ΄μ μΉ νμ΄μ§λ₯Ό μ΄λ»κ² 그릴κΉ?
μ΄ μ 보λ₯Ό νλ©΄μ ν½μ
λ‘ λ°ννλ μμ
μ λμ€ν°ν (rasterizing)λΌκ³ νλ€
κ°μ₯ λ¨μν λμ€ν°νλ μλ§ λ·° ν¬νΈ μμͺ½μ λμ€ν°νλ κ²μΌ κ²μ΄λ€
μ¬μ©μκ° μΉ νμ΄μ§λ₯Ό μ€ν¬λ‘€νλ©΄ μ΄λ―Έ λμ€ν°νν νλ μμ μμ§μ΄κ³ λλ¨Έμ§ λΉ λΆλΆμ μΆκ°λ‘ λμ€ν°ννλ€
μ΄ λ°©μμ Chromeμ΄ μ²μ μΆμ λμμ λ λμ€ν°νν λ°©μμ΄λ€
κ·Έλ¬λ μ΅μ λΈλΌμ°μ λ ν©μ± (compositing)μ΄λΌλ λ μ κ΅ν κ³Όμ μ κ±°μΉλ€
λ λλ§ νμ΄νλΌμΈμμλ μ΄ λ¨κ³λΆν° GPUκ° λ§μ΄ μ¬μ©λλ€
λ μ΄μ΄λ₯Ό ν©μ±ν λλ GPUκ° λ μ 리νλ€
GPU vs CPU
λ λλ§ νμ΄νλΌμΈμ μ€λͺ ν λ νμΈνΈ (paint)μ 그리기 (draw)λΌλ μ©μ΄κ° λ€λ₯΄κ² μ¬μ©λκ³ μλ€λ μ μ μ£Όλͺ©ν΄μΌ νλ€
νμΈνΈλ νμΈνΈ μμ μ λ§λ€μ΄λ΄λ κ²μ μλ―Ένκ³ ,
그리기λ νμΈνΈ μμ μ κΈ°λ°μΌλ‘ λΉνΈλ§₯μ΄λ ν μ€μ²λ₯Ό λ§λ€μ΄ λ΄λ κ²μ μλ―Ένλ€
λ μ νν ννμ ν©μ± νλ μ (compositing frame)μ λ§λ€μ΄λ΄λ κ²μ΄λ€