https://danji-ya.github.io/JS_javascript30/08-FunWithHTML5Canvas/
+
clear 버튼 클릭 시, 캔버스를 초기화 시킨다.+
윈도우가 resize 될 때마다 캔버스의 크기를 변화시킨다.윈도우 size를 변경시킬 때 마다 캔버스 사이즈를 변경해봤는데 캔버스 안의 내용들이 초기화가 된다.
그렇다면 캔버스에 그려진 내용을 새로운 캔버스에 다시 그려줘야하는데 window.addEventListener("resize", callFun)
이 호출되는 횟수가 너무나도 많았다. 캔버스 뿐만 아니라 무거운 계산이 존재한다면 퍼포먼스 이슈가 생길 것이다. 그래서 debounce방식을 찾아보게 되었다.
function debounce(func, time = 100){
let timer;
return function(){
if(timer) clearTimeout(timer);
timer = setTimeout(func, time);
};
}
function resizeCanvas() {
console.log(`resize Canvas`);
...
}
window.addEventListener("resize", debounce(resizeCanvas, 200));
위의 방식은 setTimeout을 이용하여 마지막으로 정의한 setTimeout를 Event Loop에서 call stack이 비어있을 때, 해당 콜백함수를 실행시키는 방식으로 불필요한 호출을 방지할 수 있었다.
<debounce 적용>
<debounce 미적용>
// Make our in-memory canvas
const offCanvas = document.createElement('canvas');
const offCtx = offCanvas.getContext('2d');
function resizeCanvas() {
...
// copy
offCanvas.width = canvasRef.width;
offCanvas.height = canvasRef.height;
offCtx.drawImage(canvasRef, 0, 0);
canvasRef.width = window.innerWidth;
canvasRef.height = window.innerHeight;
//paste
ctx.drawImage(offCanvas, 0, 0);
resetProperty();
}
캔버스가 리사이징 될 때, 눈에는 보이지 않는 임시 캔버스에 기존의 캔버스를 그려두고 우리 눈에 보이는 캔버스에 그 임시 캔버스를 그려주는 방식으로 기존의 그림을 유지할 수 있었다.