|
목록에서 글자 제한 23이였음 ?>
질문게시판 - 반드시 검색을 하신 후 원하는 답변을 찾을 수 없을 때, 질문을 올려주세요. |
| Posted by 지상현 | 2011-06-13 08:41:41, Hit : 5075 | |
|
|
|
>창조로 그림판(그림 그리는 프로그램)을 만들면 마우스를 움직일 때 깜빡거리네요... 혹시 해결할 방법 없을까요?
그림판을 어떻게 구현하셨는지 모르겠지만, 십중팔구 마우스를 끌어서 선을 그릴 때 이전에 있던 선을 지우고, 새로운 선을 그리는 방식으로 만드셨을 겁니다.
그러나 이렇게 '지우고' 새로 그리는 방법은, 지우는 순간이 화면에 보여버리는 수가 있기 때문에 깜빡이는 것처럼 보이는 것입니다.
모니터 같은 표시 장치는 화면에 표시되는 타이밍이 있기 때문에, 그리는 속도와는 상관 없이 발생합니다. 프로그램이 초당 천 번 그릴 수 있는 능력이 있더라도, 모니터가 (일반적으로) 초당 60번 밖에 표시하지 못하기 때문에 재수 없게 지우는 순간이 걸리면 지워진 그림이 1/60초동안 보인다는 이야기입니다.
근본적인 원인은, 화면을 지우는 과정, 선을 그리는 과정 등 '과정'을 사용자에게 보여주기 때문입니다.
결과를 얻기 위한 과정도 중요하지만, 그림을 그릴 때만은 과정은 무시하고 결과만 보여주는 것도 한 방법이 될 수 있습니다.
이 문제를 해결하려면, '지움'과 동시에 '그리기'를 해줘야 하지만, 그렇게 할 수 있는 명령어가 없으며, 직접 구현하려면 점(픽셀)을 하나 하나 건드려주는 식으로 가야 합니다.
가장 깔끔한 해결책은 '과정'을 안 보이는 곳에서 다 해결한 다음 '결과'만 보여주는 것입니다.
그려줄 곳과 똑같은 크기로 안 보이는 그림판 따위를 만드시고, 그리고자 하는 그림판과 똑같이 만들어주고, 우선 여기에 모든 것을 그립니다.
그리고 마지막에 여기에 그려준 것을 바로 보이는 그림판에 옮겨주면 됩니다.
이렇게 하면 원래 있던 그림에 새 그림을 덮어 쓰기 때문에 '지우는 과정'이 생략되므로 깜빡임이 발생하지 않습니다. 이러한 기법을 이중 버퍼링(Double Buffering)이라 합니다.
대신 이 방법을 쓰면 찢어짐(Tearing)이란 현상이 발생할 수도 있는데, 보이는 그림판으로 그림을 옮기는 과정에서 절반 밖에 못 옮겼을 때 화면에 표시되면, 남아있던 원래 그림과 새로 덮어 그리는 원래 화면에 절반씩 섞여있는 모양으로 보일 것입니다. 그렇지만 대부분의 경우 화면을 확 지우는 등 극적으로 바뀌는게 아니라 기존 그림에서 조금 더 바뀐 형태인 경우가 대부분이기 때문에, 그림이 전체적으로 약간 비틀린듯한 느낌을 주게 됩니다. 그래서 이 현상을 Tearing이라 합니다.
그렇지만 Tearing은 크게 눈에 띄지도 않고 게임처럼 화면이 실시간으로 바뀌지 않는 이상 크게 문제될 것이 없습니다.
일부러 길게 썼는데, 결론은 화면에 보이는 그림판에 작업하지 마시고, 안 보이는 그림판에 작업하신 다음 보이는 그림판에 한 번에 옮기시면 되며, 이러한 기법을 Double Buffering이라 한다는 것입니다.
참고가 되셨길 바랍니다. |
|
|
paintj 2011-06-13 PM 5:38:47 |
|
|
|
정확히 어떻게 해결해야 하는지 감이 안오네요ㅠㅠ
기존 프로그램을 버전업하면서 아예 새로 만들고 있는데, 이상하게 같은 명령어를 사용함에도 불구하고 기존의 프로그램은 깜박임이 없고, 새로 만들고 있는 프로그램에는 깜박임이 발생합니다.
기존 프로그램에는
그림판 마우스버튼을 누를때
그림판0.배경.펜이동(X, Y);
눌림:=참;
마우스버튼을 뗄때
그림판0.배경.선그려(X, Y);
눌림:=거짓;
마우스를 움직일때
만일(눌림) {
그림판0.배경.선그려(X, Y);
}
그리고 초기화 명령어로
진리:눌림;
으로 그림 그리는 기능을 구현하고 있습니다.
기존 프로그램에서는 깜박임이 전혀 없는데, 새로 만드니까 이상하게 깜박임이 발생하네요... |
|
|
paintj 2011-06-13 PM 5:43:01 |
|
|
|
그리고 말씀해주신 더블 버퍼링을 시도해보려고 기존 그림판과 같은위치 아래에 같은 그림판을 복사 붙여넣기 해서 깔아버리고 명령어를
마우스버튼을 누를때
그림판1.배경.펜이동(X, Y);
그림판0.그림.할당해(그림판1.그림);
눌림:=참;
마우스버튼을 뗄때
그림판1.배경.선그려(X, Y);
그림판0.그림.할당해(그림판1.그림);
눌림:=거짓;
마우스를 움직일때
만일(눌림) {
그림판1.배경.선그려(X, Y);
그림판0.그림.할당해(그림판1.그림);
}
으로 해봤는데 아예 그려지지를 않네요^^;
펜 색상이라던가 폭은 당연히 설정해 둔 상태입니다... |
|
|
|
|
지우개 Expert 3.0 제작자 : 천호성 님 [LINK] |
|
|
|
대박로또2005 제작자 : 최재일 님 [LINK] |
|
|
1 | 박종훈 님 | 15292 점 | |
2 | 지상현 님 | 8809 점 | |
3 | 손상진 님 | 7388 점 | |
4 | 권선중 님 | 6060 점 | |
5 | 이진백 님 | 5174 점 | |
|
|
|
가입일 | 닉네임 |
05/31 | 김동률 |
03/31 | 홍형기 |
09/01 | o00pp99oo |
12/27 | 이재민 |
11/20 | 이희철 |
|
|
|
|
. |
. |
. |
|