웹 브라우저 구조
웹 페이지를 제외하고 사용자와 상호작용하는 인터페이스. (주소 표시줄 ,이전/다음/새로고침 버튼 등)
HTML과 CSS를 파싱하여 요청한 웹 페이지를 표시하는 렌더링 엔진
Networking
각종 네트워킹 을 수행하는 네트워킹 파트
UI Backend
체크박스나 버튼과 같은 기본적인 위젯을 그려주는 UI 백엔드 파트
javascript interpreter
자바스크립트 코드를 실행하는 인터프리터 (크롬같은 경우는 V8엔진 사용)
유저 인터페이스와 렌더링 엔진을 연결하는 브라우저 엔진.
localStorage나 Cookie 와 같이 보조 기억장치에 데이터를 저장하는 파트.
(화면에 그려질 것만 결정한다)
그리고 렌더트리를 배치(Layout)한 후, 마지막으로 렌더트리를 그립니다. 렌더트리를 그리는 과정에서 화면에 그리는 Paint라는 레이어를 채우는 과정을 거쳐 합성(Composite)을 통해 실제로 레스터화를 하며 픽셀로 변환하는 단계를 거칩니다.
레이아웃단계(reFlow)
뷰포트내에서 정확한 크기와 위치를 계산하는 과정. 영역이나 여백 그리고 스타일 속성등등.css 에서 퍼센테이지나 em 같은 상대적인 단위를 사용했을때 그땐 뷰포트에 맞춰서 픽셀단위로 전환됩니다.
(Rendering Engine 에서 이제 뷰포트에서 각 노드들이 어떻게 생겼고 어디 위치에 놓여야하는지 알게되면) 페인팅 단계 실행.
페인팅 단계(실제 브라우저 화면에 그리는 과정)
레이아웃 단계에서 각 노드들이 위치, 크기, 색상 등 스타일이 모두 계산이 되었기 때문에 화면에 실제 픽셀로 변환하게 해서 요소를 그려준다.
Paint 단계에서는 Layout 단계에서 계산된 값을 이용해 Render Tree의 각 노드를 화면상의 실제 픽셀로 변환한다. 이때 픽셀로 변환된 결과는 하나의 레이어가 아니라 여러 개의 레이어로 관리된다.
12.Composite(페인트 과정에서 분리하여 작업 해놓았던 레이어들을 합성하는 과정)
Composite 단계에서는 Paint 단계에서 생성된 레이어를 합성하여 실제 화면에 나타낸다. 우리는 화면에서 웹 페이지를 볼 수 있다.
중간에 HTML파서는 Script태그를 만나게 되면 javascript 코드를 실행하기 위해 파싱을 중단 -> 제어권한을 자바스크립트 엔진에게 넘기고, 자바스크립트 코드 또는 파일을 로드해서 파싱하고 실행(async,defer 를 사용해서 방식을 다르게 바꿀 수 있음)
주로 요소의 크기나 위치가 바뀔 때 혹은 브라우저 창의 크기가 바뀔 때 다시 발생.
layout→paint→composite
주로 배경 이미지나 텍스트 색상, 그림자 등 레이아웃의 수치를 변화시키지 않는 스타일의 변경이 일어났을 때 발생된다.
Paint→composite
아무래도 성능적으로 Layout을 발생시키는것보단 더 효율이 좋다.
위 두가지를 수행하지 않고 레이어 합성만 발생하기 때문에 성능상 제일 큰 이점을 가진다.
크롬인경우 레이아웃 과정이후에 정해준 기준이나 필요에 의해서 브라우저가 레이아웃을 생성하게 됩니다. 렌더트리에 담겨져있는 노드객체들은 생성된 레이아웃에 포함하게 됩니다. 각 레이아웃들은 페인팅 과정에서 미리 레이아웃을 그려준다음에 하나의 비트맵으로 합성해서 그려줍니다.
csstriggers.com 을 통해서 각 css속성의 성능을 확인할 수 있습니다.