IDL/New Graphics

New Graphics에서 그래픽 표출 속도 향상법

이상우_IDL 2011. 11. 4. 20:29
728x90

제가 이 블로그를 통하여 New Graphics(이하 NG라 부름)에서 각종 그래픽 구현방법들을 소개해오고 있습니다. 그런데 NG체계에서 작업을 해보면 전반적으로 뭔가 속도가 좀 더디다는 느낌이 들 경우가 종종 있습니다. 물론 Direct Graphics(이하 DG라 부름)에서보다는 당연히 느립니다. NG는 기본적으로 메모리 소모가 어느 정도 이상은 있을 수 밖에 없는 객체지향 그래픽 기반이기 때문에 태생적으로 그럴 수밖에 없습니다. 다만 NG체계에서 작업을 하면서 속도를 약간 향상시킬 수 있는 방법을 소개하고자 합니다. 얼마전에 있었던 Mark Piper의 Webinar를 듣다가 알게 된 내용입니다. 당시에 이 분께서 강의하시던 예제코드에 이러한 방법이 사용된 것을 보고 제가 질문을 했었는데, 나중에 이 문제와 관련하여 이 분과 메일을 주고받으면서 내용을 정리한 것입니다. 물론 이 분의 블로그(여기)에도 지금 소개하고자 하는 내용과 유사한 내용이 이미 올라와 있으므로, 관심있으신 분은 한번 가보셔도 좋겠습니다.


test_refresh_20111022.pro


설명을 위하여 제가 예제코드를 준비했습니다. 이 글의 첨부파일로 올려놓았으니 받아서 사용하시면 됩니다. 이 예제코드는 다음 그림과 같이 NG 체계에서 Stereographic 도법 기반의 지도를 그리고 그 위에 사각형 폴리곤을 하나 추가하여 그림을 그리도록 되어 있습니다. 이 예제코드를 일단 실행을 해보면 NG 기반의 윈도우가 뜨고 이와 같은 그림을 그리게 되는데, 이 때 IDL의 커맨드 입력창을 보면 웬 숫자 하나가 출력되는 것이 보일 것입니다. 이 숫자는 이 프로그램이 실행되는데 걸린 소요시간을 초단위로 출력한 것입니다. 이 예제코드가 돌아가는 컴퓨터의 사양에 따라서, 또는 같은 컴퓨터에서라도 상태에 따라서 이 값은 다소 차이가 있을 수 있습니다. 제 컴퓨터에서도 마찬가지인데, 일단 지금 이 시간에 돌려본 바로는 2.5~3.0초 정도가 걸리는 것으로 나옵니다.



이 코드를 보면 10번째 및 30번째 줄에 있는 문구가 ;으로 비활성화되어 있습니다. 그래서 ;을 지워서 이 두 줄을 활성화시키고 다시 프로그램을 실행해봅시다. 그러면 아마도 출력되는 소요시간이 줄어든 것을 확인할 수 있을 것입니다. 제가 돌려본 결과는 1.9~2.1초 정도로 나옵니다. 그래서 약 20~30% 정도의 속도 향상이 있는 것으로 나옵니다. 물론 이 수치들은 여러가지 제반 여건에 따라 달라질 수 있겠지만, 소요시간이 줄어드는 것만은 확실합니다. 여기서 활성화시켰던 두 줄의 내용은 NG체계에서 WINDOW 함수로 구현된 그래픽 윈도우의 Refresh라는 메서드를 사용한 것입니다.


~~~~~

win.Refresh, /DISABLE

~~~~~(중간과정)

win.Refresh


원래 그래픽 윈도우상에 여러가지의 그래픽 요소들이 구현되는 경우, 그 구현 과정은 순차적으로 모든 과정이 보여지게 됩니다. 하지만 Refresh 메서드에 /DIABLE 키워드를 설정하면 이러한 과정들을 일일이 다 보여주지 않게 됩니다. 그리고 Refresh 메서드를 다시 사용하면 그때에서야 이 과정이 다시 보이게 되는 방식입니다. 따라서 앞서 활성화했던 두 줄 사이의 중간과정들은 시각적으로 보여지지 않습니다. 이 예제코드에서의 중간과정에서는 맵의 도법을 설정하고 대륙선 및 격자를 그리고 사각형 폴리곤을 그리는 등의 작업들이 이루어지는데, 앞서 비활성화를 해제하기 전에는 이러한 과정들이 세세하게 눈으로 보였지만 이제는 이 중간과정들은 시각적으로 보이지 않음을 확인할 수 있습니다. 이렇게 중간과정을 보여주지 않아도 되므로 속도가 어느 정도 향상되는 효과가 생기는 것입니다.


또 한가지 흥미로운 점은 9번째 줄의 WINDOW 함수에서 BUFFER라는 속성을 설정하는 경우인데, 현재 BUFFER=0으로 되어있는 이 값을 BUFFER=1로 바꿔준 다음, 위와 같은 과정을 똑같이 테스트해봅니다. 참고로 이 BUFFER라는 속성을 활성화하면 그림이 화면상이 아닌 메모리상에서 그려집니다. 따라서 화면상에는 아예 윈도우가 보이지 않습니다. 이와 같이 메모리상에만 작업이 이루어질 경우에도 Refresh 메서드를 비활성화할 경우와 활성화할 경우의 속도차이가 납니다. 사실 이 경우가 속도의 차이가 더 두드러집니다. BUFFER=1인 상태에서 Refresh 메서드와 관련된 두 줄이 비활성화된 경우의 속도는 제 경우 4.5초 정도로 나왔지만, 활성화를 시킨 후에는 1.9~2.0초 정도가 나옵니다. 즉 두 배 이상의 속도향상이 있습니다.


이렇게 속도 차이가 두드러지게 나타나는 이유는, BUFFER=1인 상태에서 Refresh 메서드가 활성화되어 있는 경우의 속도가 BUFFER=0인 경우보다도 느리게 나오기 때문입니다. 즉, 메모리상에서만 작업을 할 경우에는 Refresh 메서드도 반드시 비활성화해야 처리속도를 높일 수 있다는 얘기가 됩니다. 물론 이와 같이 화면에는 아무것도 나오지 않은 상태로 작업을 해야하는 경우가 일반적으로는 자주 있지는 않습니다. 다만, 굳이 화면상에 모든 과정을 드러내지 않고 내부적인 처리만 해야 할 경우라면 이러한 방법을 사용해야 하는데, 이 경우 Refresh 메서드를 반드시 비활성화해줄 필요가 있다는 것을 확인할 수 있습니다.


여러 경우들을 테스트해본 것이라 다소 장황해 보일 수도 있겠지만, 결론은 NG 체계에서 WINDOW 함수로 생성된 그래픽 윈도우에 대하여 Refresh 메서드를 상황에 맞게 조절할 수 있다는 것을 알아두면 여러모로 편리하다는 것입니다.

test_refresh_20111022.pro
0.0MB
LIST