실제 레이아웃을 건드리면 reflow와 repaint가 일어나고 이 경우에는 메인 스레드를 사용함, transform opacity는 gpu를 사용하고 reflow가 일어나지 않기 때문에 더 빠르다. chatgpt도 gpu를 사용하기 때문에 가능해진 것. 캔버스도 gpu 가속을 사용함
setTimeout을 사용하면 안좋은 이유도 마찬가지. setTimeout을 사용하면 메인 스레드를 사용하고 있으니 메인 스레드가 점유되어서 느려지는 것. 작업을 끊어서 처리를 해야함.
내가 쓰는 속성이 왜 빠른지 설명할 수 있어야함.
reflow, gpu 가속화. 최적화 책 찾아보기!
애니메이션은 연속된 frame의 처리이다.
VSync(vertical synchronization): 그래픽카드 프레임생성과 모니터의 출력 타이밍 차이가 있을 때 동기화시켜서 매끄러운 영상을 제공하는 기술을 말한다.
Vsync 즉 모니터의 화면 갱신 주기는 보통 60Hz (1000초에 60번 갱신)
inverval은 16.66ms(1000/60)
Frames Per Second. 애니메이션 관점에서 frame 수가 중요. 모니터 갱신 주기에 맞춰 60fps
보통 30FPS 이상이면 부드럽게 움직이는 것으로 인식, 60FPS가 이상적이다. 게임인 경우 120FPS, 144FPS, 240FPS 도 사용한다.
javascript 실행 -> layout 계산 -> render tree -> paint -> composite
composite 단계의 변화를 줄 수 있는 CSS 속성들:
transform: translateXX, transform: scale(), transform: rotate(), opacity
https://d2.naver.com/helloworld/2061385
GPU 가속이라고도 함. GraphicsLayer 단위로 렌더링된 이미지를 GPU를 이용해 한 장의 이미지로 합성해서 화면에 출력하는 기술.
// 하드웨어 가속이 적합한 기기면 true 값을 반환
jindo.m.useCss3d();
문제를 해결하기 위해 will-change를 사용하도록 한다. 미래에 변경이 발생할 속성에 관해 브라우저에게 힌트를 주어 브라우저가 사전에 최적화하도록 하는 것. 이것도 작업이 끝나면 제거해주어야 성능에 영향을 미치지 않는다.
<video>
또는 <canvas>
요소
위가 RenderLayer이고, 최종적으로 레이어가 합쳐져서 화면에 보여지는 것이 GraphicLayer.
객: 손님 객, 몸 체. 어떠한 사물을 말한다. 구성 - 속성과 행위. 어떠한 집합. 속성은 메소드에 의해서 변한다. 명시적인 방법에 의해서 변경하는 것이 좋다.
클래스는 한 줄로 설명될 수 있어야 한다.
JS는 이미 오브젝트 리터럴이 있어서 두 개 이상의 중복된 인스턴스가 필요하지 않은 경우 굳이 쓸 필요 없음.
요새는 잘 안쓰여서 진짜 찾아보기가 어려움
아키텍처나 디자인 패턴 이런거 다 OOP에서 나온 맥락. 전부 의존성을 줄이기 위해서 나온 것들
오브젝트 리터럴로 이렇게 쓸 수도 있음
var healthObj = {
name : "달리기",
lastTime : "PM10:12",
showHealth : function() {
console.log(this.name + "님, 오늘은 " + this.lastTime + "에 운동을 하셨네요");
}
}
healthObj.showHealth();
객체의 생성자에는 꼭 필요한 것만 넣자. 왜냐면 class 생성자 안에 있는 함수들은 메모리를 다 따로 먹음. 왜냐면 개별 인스턴스화 되니까. 같은 의미에서 object literal 도 함수들이 다 개별로 저장됨.
클래스는 원래 없다가 나중에 만들어짐. 원래는 prototype으로 했었음.
클래스들끼리 소통하기 위해 사용하는 메소드는 public method.