λ Œλ”λŸ¬ν”„λ‘œμ„ΈμŠ€ λ‚΄λΆ€ λ™μž‘

κΉ€μœ€μ§„Β·2022λ…„ 3μ›” 18일
0

λΈŒλΌμš°μ €

λͺ©λ‘ 보기
4/4

μ €μž‘κΆŒ
이 κΈ€μ˜ 원문은 λ‹€μŒκ³Ό 같은 μ €μž‘κΆŒ 기쀀을 λ”°λ¦…λ‹ˆλ‹€.
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λ₯Ό μ‚¬μš©μžμ™€ μƒν˜Έμž‘μš©μ„ ν•  수 μžˆλŠ” μ›Ή νŽ˜μ΄μ§€λ‘œ λ³€ν™˜ν•˜λŠ” 것이닀


νŒŒμ‹±


DOM ꡬ좕


νŽ˜μ΄μ§€λ₯Ό μ΄λ™ν•˜λŠ” λ‚΄λΉ„κ²Œμ΄μ…˜ μ‹€ν–‰ λ©”μ‹œμ§€λ₯Ό λ Œλ”λŸ¬ ν”„λ‘œμ„ΈμŠ€κ°€ λ°›κ³  HTML 데이터λ₯Ό μˆ˜μ‹ ν•˜κΈ° μ‹œμž‘ν•˜λ©΄ λ Œλ”λŸ¬ ν”„λ‘œμ„ΈμŠ€μ˜ 메인 μŠ€λ ˆλ“œλŠ” λ¬Έμžμ—΄(HTML)을 νŒŒμ‹±ν•΄μ„œ DOM(document object model)으둜 λ³€ν™˜ν•˜κΈ° μ‹œμž‘ν•œλ‹€

DOM은 λΈŒλΌμš°μ €κ°€ λ‚΄λΆ€μ μœΌλ‘œ μ›Ή νŽ˜μ΄μ§€λ₯Ό ν‘œν˜„ν•˜λŠ” 방법일 뿐만 μ•„λ‹ˆλΌ μ›Ή κ°œλ°œμžκ°€ JavaScriptλ₯Ό 톡해 μƒν˜Έμž‘μš©μ„ ν•  수 μžˆλŠ” 데이터 ꡬ쑰이자 API이닀

HTML λ¬Έμ„œλ₯Ό DOM으둜 νŒŒμ‹±ν•˜λŠ” 방법은 HTML ν‘œμ€€μ— μ •μ˜λ˜μ–΄ μžˆλ‹€

λΈŒλΌμš°μ €μ—μ„œ HTML λ¬Έμ„œλ₯Ό μ—΄μ—ˆμ„ λ•Œ 였λ₯˜λ₯Ό λ°˜ν™˜λ°›μ€ 적이 μ—†μ—ˆμ„ 것이닀

HTML은 λ‹«λŠ” νƒœκ·Έκ°€ λˆ„λ½λ˜μ–΄λ„ μœ νš¨ν•œ HTML이닀
였λ₯˜λ₯Ό μš°μ•„ν•˜κ²Œ μ²˜λ¦¬ν•˜λ„λ‘ HTML λͺ…μ„Έκ°€ μ„€κ³„λ˜μ—ˆκΈ° λ•Œλ¬Έμ΄λ‹€
νŒŒμ„œμ˜ 였λ₯˜ 처리 κ°œμš”μ™€ 사둀


ν•˜μœ„ λ¦¬μ†ŒμŠ€(subresource) λ‘œλ”©


μ›Ή μ‚¬μ΄νŠΈλŠ” 일반적으둜 이미지, 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)을 λ§Œλ“€μ–΄λ‚΄λŠ” 것이닀


ν•©μ„±μ΄λž€?


0개의 λŒ“κΈ€