DOM Canvas 더블버퍼링

황제낙엽 2016.08.22 07:13 조회 수 : 755

아래 예제는 모든 클릭한 지점에 원이 그려지는 이벤트를 작성한다.

 

HTML 파일

초기화 이벤트와 클릭시 이벤트를 처리한다.

  1. <body onload="load(this)">

  2.     <canvas  id="draw" onclick="draw(event)" width="500px" height="500px;"></canvas>   

  3. </body>

 

javascript 

load 함수는 배경 이미지를 그려주는 이벤트이다.

draw 함수는 클릭했을 때 배열에 클릭 지점을 저장하고, 배경을 그리고 모든 클릭한 지점에 원을 그려주는 예제이다.

 

버퍼에 그림을 그리고, 마지막에 실제 캔버스에 그림을 그림으로서 깜박이는 효과를 제거하였다.

  1. // 클릭한 위치를 저장하는 배열

  2. var ptList = new Array();

  3.  

  4. // ctx, buffer ctx

  5. var ctx = null;

  6. var bufCtx = null;

  7.  

  8. // 초기 이미지

  9. var img = new Image();

  10.  

  11. function load(target) {

  12.     // 실제로 그려지는 위치의 캔버스 생성

  13.     var canvas = document.getElementById("draw");

  14.     ctx = canvas.getContext("2d");

  15.        

  16.     // 버퍼링용 캔버스 생성

  17.     var bufCanvas = document.createElement("canvas");

  18.     bufCtx = bufCanvas.getContext("2d");

  19.    

  20.     // 버퍼 크기 설정

  21.     bufCtx.canvas.width = ctx.canvas.width;

  22.     bufCtx.canvas.height = ctx.canvas.height;

  23.    

  24.     // 이미지 로드

  25.     img = new Image();

  26.     img.src = "/example-canvas/test.jpg";

  27.     img.onload = function() {

  28.         // 이미지가 로딩 완료시 이미지를 그려줘야 이미지가 나온다.

  29.        

  30.         // 처음 이미지 그림

  31.         // 이미지를 버퍼에 그림

  32.         bufCtx.drawImage(img, 0, 0);

  33.         // 버퍼를 캔버스에 그림

  34.         ctx.drawImage(bufCtx.canvas, 0, 0);

  35.     }

  36. }

  37.  

  38.  

  39. function draw(event) {

  40.     // 이벤트가 발생된 dom 객체의 좌표를 기준으로 한다.

  41.     var x = (event.offsetX == undefined ? event.layerX : event.offsetX);

  42.     var y = (event.offsetY == undefined ? event.layerY : event.offsetY);

  43.     var pos = new Object();

  44.     pos.x = x;

  45.     pos.y = y;

  46.     // 클릭 지점 저장

  47.     ptList.push(pos);

  48.    

  49.     // 이미지를 버퍼에 그림

  50.     bufCtx.drawImage(img, 0, 0);

  51.    

  52.     for(var i=0; i<ptList.length; i++) {

  53.         var pt = ptList[i];

  54.        

  55.         // 클릭 지점에 원을 그림

  56.         bufCtx.beginPath();

  57.         bufCtx.arc(pt.x, pt.y, 10, 0, 2*Math.PI, true);

  58.         bufCtx.closePath();

  59.         bufCtx.stroke();

  60.     }

  61.    

  62.     // 버퍼를 캔버스에 그림

  63.     ctx.drawImage(bufCtx.canvas, 0, 0);

  64.    

  65. }

  66.  

  67.  

  68.  

 

 

Q ) 왜 더블버퍼링 로직을 클릭 이벤트시에 처리하는가?

일반적인 UI 프로그래밍시 draw 이벤트를 제공하여 

이 때 그림을 그려주어야 이미지가 invalidate되더라도 다시 복원이 된다.

 

하지만 HTML은 캔버스에 이미지가 그려질 경우 자동적으로 이미지를 복원해 주기 때문에,

클릭시 이미지를 그려주면 된다.

 

번호 제목 글쓴이 날짜 조회 수
128 Web Speech API Example (HTML5 STT & TTS) file 황제낙엽 2025.04.14 731
127 모바일과 데스크톱을 포괄하는 사용자의 터치 이벤트(onPointerTap) 황제낙엽 2025.04.09 648
126 Web RTC 에 관하여 황제낙엽 2024.11.20 626
125 div와 span의 차이점 (from Bing) 황제낙엽 2023.06.16 685
124 flexbox (flexible box layout) 황제낙엽 2023.02.27 641
123 characters from ISO 8859-1 황제낙엽 2020.11.10 36946
122 HTML FRAMESET 태그 예제 황제낙엽 2020.11.06 718
121 스마트 기기에서 여러 단말기의 해상도에 대응하기 위해 사용하는 HTML viewport meta tag 황제낙엽 2020.11.06 644
120 네이버의 무료 나눔 글꼴 황제낙엽 2020.05.06 1762
119 서버의 이미지나 txt 파일을 웹브라우저에서 다운로드하기 황제낙엽 2019.05.13 867
118 When to encode space to plus (+) or %20? (application/x-www-form-urlencoded) 황제낙엽 2019.04.15 917
117 HTTP/2 소개 황제낙엽 2018.10.12 693
116 글자, 문자, 텍스트, 글꼴, 서체, 폰트와 관련한 속성들 / font-size , 크기 단위(em, px, pt, rem), 절대 단위, 상대 단위 황제낙엽 2018.04.18 842
115 Pragma와 Cache-Control 황제낙엽 2018.03.28 845
114 로드밸런싱(L4)+아파치를 운영시 etag제거로 캐시 성능 최적화 file 황제낙엽 2018.03.28 944
113 HTTP 요청 헤더 III - If-Match, If-Modified-Since, If-None-Match file 황제낙엽 2018.03.27 726
112 재미난 로그인 페이지 만들기 file 황제낙엽 2018.03.26 1592
111 HTTP Cache-Control 요청 지시어 황제낙엽 2018.03.09 713
110 내 웹사이트의 속도를 빠르게! file 황제낙엽 2018.03.07 860
109 성능을 위한 초간단 HTTP 304 Not Modified 구현 방법 file 황제낙엽 2018.03.07 816