2012.05.05 16:52

컴푸터에서 그래픽을 표시하기 위해서는 일정 시간마다 화면을 뿌려줘야 합니다. 움직임이 있을때는 더욱 그렇죠.


그런데, 이 화면을 갱신하다보면, 자주 있는 일이 화면이 깜박이는 현상(flickering)입니다.


이것은, 컴퓨터가 화면을 뿌리는것과, 화면이 그려주는것이 서로 동시에 이루어 져서 사실, 좌측 상단에서부터 차례로 그리는것인데, 인간의 눈으로 보면, 이것이 너무 빨리 되기 때문에, 아직 안그려진부분이 순식간에 채워져서 깜박이는것처럼 보이는것입니다. // 이에대한 생각은 틀릴 수 도 있지만, 제가 경험해본 바로는 이렇습니다.


처음에, C로 콘솔 테트리스를 짤때도 이것이 문제가 되었습니다. 매초마다 화면을 갱신하다 보니, 전체를 그리려면, 시간이 좀 걸렸고, 몇몇부분에서는(특히, 이전에 그려져있었던 장소에 또 다시한번 그리는바람에) 깜박임 현상이 생겼습니다. 그때는, 또 그려야 하는 부분을 검출해서, 해당 부분을 그리지 않고, 변동사항이 생긴 부분만 그렸습니다.

그래서 어느정도 이 현상을 해결했었죠.


요즘에 자바로 만드는데, 역시 이 깜박임 현상이 문제가 됩니다........


하지만, 자바는 우릴 버리지 않았습니다.ㅋ(응?)


기존 awt에서 없던 기능인 더블버퍼링을 손쉽게 구현해주는 기능이 swing에 생겼기 때문이죠!


본래, 더블 버퍼링을 구현하려면, 일단, 임시 버퍼에 모두 그리고 나서, 이 임시버퍼를 다시 본래화면표시용 버퍼에 그리는 방식으로 했었습니다. 이렇게 하면, 일단 paint()의 내부 로직이 더럽게 됩니다....


swing에서는 이 문제를 아주 쉽게 해결할 수 있도록, JFrame에서 지원해줍니다.


{

.

.

.

setResizable(false);

setVisible(true);


createBufferStrategy(2);

}


(set... 한 부분은 중요하지 않습니다. 단지, createBufferStrategy() 매서드의 호출 순서를 보여줄 뿐,,)


바로 저것이.... 더블 버퍼(이중 버퍼)를 만드는 매서드입니다.... 참 쉽죠잉.......-_-


그리고나서, 버퍼에 그림을 그려야하는데;;; 어디다 그리느냐?



Graphics2D g = (Graphics2D) jframe.getBufferStrategy().getDrawGraphics();


g.setColor(font_debug);

// 무언가 그린다.

g.dispose();


getMasterWindow().getBufferStrategy().show();



이상입니다..


JFrame 인스턴스로부터 BufferStrategy 를 가져오고, 이 버퍼전략(...)으로부터 그래픽인터페이스를 받아오면됩니다....


마지막으로, 화면에 출력하기 위해, show() 하면 끝......


더블버퍼 참 쉽죠잉;;;-_-















저작자 표시 비영리 변경 금지
신고
Trackback 0 Comment 3
  1. Favicon of http://estellesiahome.tistory.com BlogIcon 에스텔시아 2012.05.12 19:37 신고 address edit & del reply

    Good! 오랫만에 올라오는 실용적인 글이다.

  2. Favicon of http://euro2012.vnexpress.net/ BlogIcon euro 2012 2012.05.30 19:40 신고 address edit & del reply

    모든 입력, 매우 도움이 흥미있는 정보를 주셔서 감사합니다

  3. 2012.06.12 14:44 address edit & del reply

    비밀댓글입니다



티스토리 툴바