GDI+에 대하여

GDI+는 잘 알다시피 전통적인 윈도우 API가 제공하는 GDI에서 더 나아가, 더 향상된 그래픽과 더 깔끔해진 프로그래밍 패러다임을 제공하는 그래픽 API이다. 사실, 닷넷에서는 애초에 기본 그래픽 API가 GDI+이다. (System.Drawing 네임스페이스)

GDI+는 벌써 10년 전, 닷넷 프레임워크가 첫 등장하고 윈도우와 오피스에 XP라는 브랜드가 붙던 시절에 도입되었다. MS가 제공하는 API로는 흔치 않게 C언어 함수도 아니고 그렇다고 DirectX 같은 COM도 아닌, C++ 언어 형태로 되어 있다. 물론, 그래도 실제로 링크를 해 보면 symbol들은 다 C언어 함수 호출 형태로 된다. C++ 클래스는 단순히 C 함수를 호출하는 wrapper인 것이다.

GDI+는 여러 편리한 기능을 많이 제공하지만, 무엇보다도 벡터 그래픽에 안티앨리어싱을 넣기 위해서라도 쓰지 않을 수 없다. 이런 간단한 기능은 그냥 기존 GDI 함수에다가도 옵션을 확장해서 좀 넣어 주지 하는 아쉬움이 있다. 재래식 GDI로도 안티앨리어싱된 텍스트는 얼마든지 찍을 수 있는 것처럼 말이다. (LOGFONT 구조체에 글꼴의 품질을 지정하는 추상화 계층이 있기 때문에, 나중에 추가된 안티앨리어싱 기능도 얼마든지 지정 가능)

재래식 GDI는 열악하던 컴퓨터 환경에서 최대한 장치 독립적인 추상적인 그래픽 계층을 구현하는 게 목표였다. 그래서 래스터 그래픽보다는 벡터 그래픽에, 애니메이션보다는 정적인 그래픽에 초점이 가 있었다. 그 추상화 계층이 확장성 측면에서 편리한 점은 분명 있었지만, 색깔을 하나 바꾸려고 해도 펜이나 브러시를 다시 만들고, 도스 시절의 그래픽 프로그래밍 때는 할 필요가 없었던 GDI 객체 관리를 해야 하니 상당히 불편했다.

그래서 GDI는 게임 그래픽용으로는 적합하지 않은 구석이 있었다. 물론, 지금과 같은 틀을 유지하면서도 JPG/PNG 이미지를 지원하고, 알파 채널 비트맵 Blit이나 별도의 gradient fill 함수를 추가하고, 윈도우 2000처럼 펜이나 브러시의 색깔을 손쉽게 바꿀 수 있는 DC pen/DC brush 같은 기능을 stock object로 넣는 등, 기능 개선이 꾸준히 진행돼 왔다. 하지만 MS 측에서는 이에 만족하지 못하고 이 참에 API를 근본적으로 갈아엎고 싶다는 욕망을 느꼈던 모양이다.

GDI+는 모든 API가 자신만의 별도의 namespace 안에 선언되어 있으며, POINT 같은 간단한 자료형도 자신만의 것을 재정의하여 쓸 정도로 기존 윈도우 API와는 거리를 두고 만들어졌다. 그리고 C++답게 같은 함수도 다양한 overload 버전이 존재하며, 좌표는 정수뿐만이 아니라 실수로도 받기 때문에 편리하다.

사소한 것이다만, 글자를 찍을 때 null-terminated string에 대해서 글자 길이 지정을 생략해도 되는 것 역시 마음에 든다.
전통적으로 윈도우의 GDI 함수들은 글자를 찍는 함수들은 문자열 길이를 반드시 지정해 주게 되어 있다. 왜냐하면 한 null-terminated string을 부분적으로 여러 줄에 걸쳐 찍어야 할 일도 있기 때문이다.

그러니 그런 API 디자인이 수긍은 가지만, 어차피 한 줄밖에 찍을 일이 없는 문자열을 매번 _wcslen 해 주는 것도 귀찮지 않은가. 예전에는 gdi가 아니라 user 계층에 있는 DrawText 같은 고수준 함수나 문자열 길이 지정을 -1로 생략이 가능했던 반면, GDI+는 이 정책이 좀 더 확대되었다.

GDI+는 GDI에 비해서 state machine으로서의 의미가 크게 퇴색했다. 그래서 그리기에 필요한 모든 정보들을 함수 호출 때 매개변수로 일일이 전달해 줘야 하는 경우가 많다. 가령, current position이라는 개념이 없기 때문에 MoveTo와 LineTo 따로가 아니며, SelectOjbect라는 개념도 없어져서 그리기 함수 때 매번 펜이나 브러시에 해당하는 개체를 따로 공급해 줘야 한다.

이런 디자인은 편리한 점도 있지만, 당장 화면에 뭔가를 찍는 드로잉 말고 벡터 path를 기록한다거나 메타파일 같은 걸 만들 때는, 내가 보기에 좀 불편하게 작용하는 점도 있는 것 같다. 가령, GDI에서는 똑같이 HDC이고 여기에다가 BeginPath를 해 주면 그때부터 path 그리기 모드로 GDI가 상태 관리를 하면서 동작한다. 그러던 것이 GDI+에서는 Graphics와 GraphicsPath라고 클래스가 아예 갈라졌다. 두 개체를 상태별로 분리한 건 분명 잘한 디자인이라는 거 인정한다.

하지만 Graphics 말고 GraphicsPath는 어차피 예전 위치에서 계속해서 이어서 그래픽을 기술하는 게 많은 만큼, 재래식 GDI처럼 current position이 있는 게 편리하지 않을까 싶다. 지금 API 체계에서는 직전 위치에 대한 정보를 응용 프로그램이 계속 공급해 줘야 한다.

또한, 복잡한 path를 화면에다 그릴 때, 예전 GDI는 지금 DC가 가지고 있는 펜과 브러시로 윤곽선을 그리고 내부를 채우는 것을 함수 호출 한 번으로 동시에 할 수 있었다. 그러나 GDI+는 선을 그리는 것과 내부를 채우는 것을 따로 해야 한다. path의 경계를 추출하여 래스터라이즈하는 것은 상당히 복잡한 계산이 필요한 작업인데, 동일한 작업이 비효율적으로 중복 적용되는 건 아닌지 우려된다.

즉, 본인은 GDI+에 대해서 참신한 기능은 분명 마음에 든다. 이 글에서 언급된 것 말고도 여러 고급 기능들이 있다. 윈도우 비스타 Aero와 연동하는 일부 드로잉 기능(가령, 클라이언트 영역에도 반투명 Aero 효과를 추가하고, 거기에다 글자를 찍는 것)은 오로지 GDI+로만 접근해야 하는 것도 있다.

하지만 (1) 그냥 재래식 GDI API에다가 옵션을 추가하는 형태로 구현했어도 충분해 보이는 것, (2) GDI+가 바꿔 놓은 API 디자인이 오히려 좀 불편하고 비효율적일 수도 있겠다 싶은 것에 대해 비판적인 안목을 갖고 있다. 속도가 재래식 GDI보다 꽤 느린 건 차치하고라도 말이다.

Posted by 사무엘

2012/04/28 08:39 2012/04/28 08:39
, ,
Response
No Trackback , 4 Comments
RSS :
http://moogi.new21.org/tc/rss/response/675

철도 인명 사고에 대한 생각

지난 3월 12일에 본인은 출근길에서부터 충격적인 소식을 들으며 월요일 하루를 시작했다.
딱 정확하게 본인이 타려는 지하철이 앞 역에서 웬 인명 사고가 발생해서 열차 운행이 한동안 중단됐기 때문이다.
이런 일은 처음이었다. 게다가 요즘은 스크린도어까지 버젓이 있는데 웬 인명 사고가 난단 말인가? 이 때문에 난생 처음으로 지하철 지연 증명서(난 뭐 지연이라기보다는 열차 탑승을 애초에 포기한 경우이지만)라는 걸 구경했다.

그런데 사고의 사망자는 놀랍게도 일반 승객이 아니라 지하철 회사의 직원이고, 역무원도 아닌 기관사인 것으로 밝혀졌다. 선로로 접근이 가능한 내부 직원이 마음먹고 자살을 하려 든다면, 제아무리 스크린도어가 갖춰져 있어도 애시당초 소용이 없을 것이다.

철도 공기업에서 승무직으로 일할 정도이면 연봉 빵빵한 건 말할 것도 없고 정년도 보장되기 때문에 겉으로 보기엔 아주 부러운 지위에 속하는 사람이다. 군대로 치면 제일 중요한 전투 병과요, 게임 개발로 치면 딱 프로그래머에 해당하지 않는가. 최소한 경제적인 문제로 인해 자살할 이유는 없다.

하긴 2004년, 본인이 아직 대학 재학 중이던 시절엔 대구 과학고의 1회 졸업생이고 카이스트 기계공학과를 졸업한 어떤 사람이 대구 지하철 기관사로 취직한 게 신문에 보도된 적도 있었다. (☞ 관련 기사 클릭 )

그땐 카이스트라는 스펙에 비해 저학벌(?) 직업을 선택한 이례적인 사례로 그 사람이 소개되었지만, 저게 과연 그렇게 만만한 직업일까? 요즘은 SKY급 대학 나오고도 공기업, 공무원엔 말단으로라도 들어가려는 사람들이 줄을 서 있을 텐데. 이런 트렌드와는 무관하게 나도 2007년에 서울 도시철도 공사에서 공채를 하던 시절에 원서를 넣긴 하고 싶은 마음이 있었다. 철도 차량 운전 면허가 없으니 승무직은 못 하더라도 다른 부서로라도 말이다. 그때 난 병특 중이었기 때문에 애당초 지원을 할 수가 없어서 못 했을 뿐이다.

다만, 지하철 기관사의 근무 여건은 그리 좋다고 보기 어렵다. 우선, 근무 시간이 불규칙적이고 교대를 돌면서 주기적으로 주말을 반납할 각오를 해야 한다. (일요일에 교회에 가야 하는 사람에겐 큰 마이너스) 아니, 승무직은 입사 지원할 때부터 주말 교대 근무에 동의한다는 각서를 제출한다. 비록 버스 기사처럼 교통 체증과 복잡한 도로, 매연, 차멀미로 인한 데미지는 없어서 좋지만, 몇 시간째 햇빛을 못 보면서 어두컴컴한 터널만 돌아다니는 것도 정서에 좋을 리가 없다. 자세한 건 예전 글을 참고할 것.

그래서 본인은 기관사가 그런 극단적인 방법으로 스스로 생을 마감할 정도이면, 근무 환경에 적응을 못 해 극도의 우울증에 시달렸거나, 아니면 정신적으로 문제가 있어서 사내에서 왕따이거나 대인 관계에 심각하게 문제가 있어서 그럴 거라고 생각했다. 이 사고에 대한 후속 뉴스 보도를 보니 내 추측이 얼추 맞는 것 같다.

특히 도철은 1인 승무를 국내 최초로 도입한 지하철 회사이기 때문에 그 점이 노조로부터 두고두고 까여 왔으며, 이번 기관사 자살 사건을 계기로 그게 또 부각되었다. 하지만 차량 상주 승무원 수의 최소화는 철도 기술의 엄연한 트렌드이기 때문에 그 자체가 근본적인 까임거리가 될 수는 없을 듯. 도철은 1990년대 중반에 1인 승무로도 모자라서 아예 무인 운전까지 시도한 적이 있는 과감한 회사이긴 하다만 말이다. (운전실이 없는 완전 무인 운전인 신분당선 전동차에도 승객들과 부대끼는 진짜 승무원이 객실에 한 명 있긴 함.)

난 우리나라 지하철의 스크린도어를 보면 무척 놀라움을 느낀다. 오죽했으면 국가에서 천문학적인 돈을 들여서 2009~2010년을 전후하여 서울 지하철의 거의 모든 역들에다 스크린도어를 도배해 버렸을까? 수백 개에 달하는 그 많은 지하철역들에다 스크린도어를 이렇게 단기간에다 모두 설치한 나라는 세계에서도 유례를 찾기 어려울 것이다. 거의 기네스북 감이 아닐까?

그만치 지하철 자살 러시가 심각한 사회 문제로 대두되고 있었기 때문에 정부가 그런 무리수를 둔 것이다. 뉴스 기사들을 검색해 보면, 당장 본인이 이용하는 집 근처의 지하철역에서만 해도 최소한 3명이 각각 2004년, 2007년, 2008년에 선로 투신으로 목숨을 끊은 적이 있다는 기록이 나온다. 그나마 스크린도어가 설치되면서 2008년 기록이 마지막이 된 것이다.

지난 2010년 8월 23일, 분당선 태평 역에서 발생한 인명 사고에도 본인은 직접적인 영향을 받았다. 이건 사람이 죽지는 않아서 큰 사고로 보도되지는 않았지만, 대학원 입학을 앞두고 사람 만날 일이 있어서 분당에서 학교로 가는 길이었는데 열차 지연으로 인한 불편을 겪었다. 분당선에서 태평과 야탑 역은 2012년 3월 현재까지도 아직 스크린도어가 없다. 다만, 공사 중이긴 하다.

직접 겪어 보지도 않고 남이 처한 상황을 폄하하고 싶지는 않다만..
저렇게 작정하고 자살하려는 사람을 치는 사고를 낸 기관사는 하나도 잘못이 없는데 왜 그 정도까지 충격과 정신 공황을 겪는지 잘 모르겠다.

사람이 끔살 당하는 장면을 라이브로 본 것에 대한 정신적 데미지는 있겠지만, 자기가 살인을 저질렀다는 식의 생각엔 제발 안 빠졌으면 좋겠다. 이건 불의의 사고로 사람이 죽은 것도 아니고, 작정하고 자살하려는 사람이 죽은 것이다. 사형 집행관만큼이나 하나도, 전혀 죄책감 가질 필요가 없다. 일본처럼 죽은 사람 유족에게 민폐에 대한 책임으로 벌금을 때리지 않은 걸 고맙게 여겨야 할 판.

그나저나 작년 12월엔 공항 철도에서 정말 어이없는 사고가 난 적이 있다. 막차 운행이 아직 안 끝났는데도 끝난 줄 알고, 선로 보수 인부 여러 명이 선로로 들어갔다가 전동차에 치여 끔살 당한 것이다. 한밤중인 데다 요즘은 전동차가 기술이 좋아서 워낙 조용하게 달리기 때문에, 저런 상황에서는 답이 없다..;; 기관사도 갑툭튀한 사람들 보고 간이 떨어질 정도로 얼마나 놀랐을까? 이건 승강장 자살도 아니고..! 텅 빈 막차를 몰고 저기까지만 가면 오늘 근무 끝이고 들어가서 잘 일만 남았을 텐데!

원래 그런 건 다 규정이 있다. 지하철의 경우, 심야에 업무를 위해 선로 내부로 들어가는 직원은 열차 운행 영업이 종료된 정도가 아니라 아예 전차선(전깃줄)이 완전히 단전된 걸 확인하고 들어가야 한다. 사탄의 인형 처키는 건전지 없이도 움직였지만-_-, 현실의 전동차는 그렇지 않으니까. -_-;; 선로 보수· 청소 차량들은 애시당초 전기가 아닌 기름으로 움직인다.
그러니 내가 보기엔 저 사고는 일차적으로는 일종의 근무 기강 문제이다. 거기에다 또 선로 보수 인력이 외주 용역이다 보니 앞뒤 손발이 안 맞은 것일 수도 있겠고.

그랬는데, 고의적인 자살이 아니면서 사람이 여럿 죽는 사고가 나 버리는 바람에, 내 기억이 맞다면 애꿎은 전동차 기관사도 일단은 잡혀 들어갔다. 경적을 안 울리고 완벽한 수준의 안전 조치를 안 취했다고... 구속인가? 한국은 법을 적용하는데 동기나 과정보다 결과를 더 우선시하는 풍토가 있어서..;; 안타까운 일이다. 기관사의 입장에서는 저건 정말 운이 없어서 이런 신세로 전락한 것이나 마찬가지이다.

물론, 하루에 전철이 수송하는 승객 수가 얼마나 엄청나고 방대한지를 감안하면, 그에 비해 저 정도로 예외적인 급으로 발생하는 사고는 정말 극소수이고 새 발의 피도 안 된다는 것이 분명한 사실이다. 철도는 정말 수송 효율이 좋고 안전한 교통수단이 맞다. 오늘도 수도권 시민들의 운송을 책임지는 지하철/전철 기관사님들 힘내시길.

Posted by 사무엘

2012/03/25 08:26 2012/03/25 08:26
, ,
Response
No Trackback , 2 Comments
RSS :
http://moogi.new21.org/tc/rss/response/659


블로그 이미지

그런즉 이제 애호박, 단호박, 늙은호박 이 셋은 항상 있으나, 그 중에 제일은 늙은호박이니라.

- 사무엘

Archives

Authors

  1. 사무엘

Calendar

«   2024/05   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

Site Stats

Total hits:
2695831
Today:
266
Yesterday:
1596