본문 바로가기

Library

vsperfcmd : Visual Studio 2008 Standalone Profiler 코드를 최적하는데 가장 필수적인 도구는 프로파일러다. 프로파일러는 어느 함수가 얼마나 많이 호출되었는지, 어느 정도의 수행 시간을 점유하는지 따위를 파악할 수 있도록 해주는 도구인데, 프로그래머라면 실제로 써본 적은 없더라도 이름은 많이 들어보았을 것이다. 유닉스 플랫폼에서 코드를 작성하고 있다면, 유닉스 컴파일러 시장은 이미 gcc가 대세를 이루고 있으므로 GNU Profiler라는 좋은 툴을 무료로 사용할 수 있다(GNU는 가난한 프로그래머에게 신의 축복이다). 그러나, 역시 중요한 플랫폼 중 하나인 윈도우에서는 Visual Studio와 잘 맞는 프로파일러를 구하기가 쉽지 않다. 물론, Visual Studio Team Suite 버전이라면 Visual Analyzer가 IDE에 포함되어 있기 때문.. 더보기
Rendering Pipeline 그래픽스에서의 렌더링 파이프라인은 크게 응용 단계(application stage), 기하 단계(geometry stage), 래스터화 단계(rasterization stage)로 구성된다. 개략적으로, 응용 단계는 기하 단계에서 처리할 3D 기하 정보를 생성하는 단계이며, 기하 단계는 이 기하 정보들을 가상의 공간에서 선형 변환하는 단계이다. 래스터화 단계는, 이 가상 공간에서의 데이터를 실제로 눈에 보이는 2D 평면으로 투영(projection)하는 단계이다. 즉, 응용 단계에서 기하 정보를 생성한다는 것은 기하 정보 생성 그 외에도 충돌 검출, 애니메이션, 포스 피드백과 같은 요소들을 반영하여 다음 기하 단계에서 처리할 모든 정보를 생성하는 것을 뜻하는 것이다. 기하 단계는 아키텍처에 따라서 소프트.. 더보기
비스타 이상에서 사운드 출력 레벨 설정하기 웨이브 출력 레벨을 설정하는 waveoutGetVolume, waveoutSetVolume은, XP까지는 잘 통용되는 방법이었지만 비스타 이상에서는 제대로 동작하지 않는다. 비스타 이상에서는 사운드 출력을 관리하는 믹서의 구성이 좀 더 복잡해졌기 때문에, waveout 관련 API를 호출해보면 MMSYSERR_NOTSUPPORT와 같은 에러를 받을 것이다. 이들 윈도우는 응용 프로그램 각각에 대해서 오디오 믹서 조절이 가능해졌는데, 사용자들에게는 다채로운 기능이지만 개발자에게는 약간 고달퍼진 셈이다. 그렇지만 조금 귀찮아졌을 뿐 사운드 출력 레벨 설정은 어렵지 않다. 사운드 출력 레벨을 조절하고 싶다면 다음 과정을 처리해주면 된다. COM 인터페이스를 사용해야 하는게 기존과 조금 달라진 부분이다. 먼저,.. 더보기
Ambient Light, Diffuse Light, Specular Reflection 물체의 재질이 어떻든 결국 빛이 있어야 비로소 물체의 색을 볼 수 있게 된다. 물체의 색이란 광원에서 나온 빛이 주변이나 물체면과 상호 작용하고, 관찰자의 눈에 와 닿는 세기에 의해 결정된다. 따라서, 이들을 어떻게 모델링하느냐에 따라 렌더링 시스템에서의 최종적인 물체의 색상이 결정된다. 일반적으로, 이것을 근사적으로 모델링하기 위해 환경광(ambient light), 난반사(diffuse reflection), 정반사(specular reflection)가 사용된다. 관찰자가 물체를 인식하게 되는 과정을 살펴보자. 먼저, 광원이 없다면, 특히 인간의 시각은 가시 광선만을 인식할 수 있기 때문에 물체가 스스로 가시 광선 영역에 해당하는 빛을 방출하거나, 그런 광원으로부터의 빛을 반사하지 못한다면, 관찰자.. 더보기
조명(Lighting) 사람이 실세계에서 표면을 볼 때 빛을 인지할 수 있는 것은, 망막에 도달한 광자 에너지가 추상체를 자극하기 때문이다. 광자는 하나 또는 여러 개의 광원으로부터 나오는데, 이들 중 일부는 흡수되고 일부는 표면에 반사된다. 뿐만 아니라, 표면의 속성에 따라 광자를 흡수하거나 반사하는 정도가 크게 달라진다. 예를 들어, 어떤 것은 빛을 일정한 방향으로만 반사하여 광택이 나지만, 어떤 것은 빛을 모든 방향으로 고르게 반사한다. 대부분의 표면은 이러한 극단적인 두 경우 사이의 속성을 갖는다. 어떤 물체를 시각으로 인지할 수 있다는 것은, 그 물체에서 반사된 빛이 관찰자의 눈까지 도달했다는 것이다. 그렇지만, 관찰자의 눈까지 도달한 빛은 순수하게 물체가 반사된 빛 외에도 여러 빛들이 포함되어 있다. 예를 들어, 어.. 더보기
Color Model 가장 흔히 쓰이는 컬러 모델은, 가산 모델(additive model)인 RGB 모델과 감산 모델(subtractive model)인 CMY 모델이 있다. RGB 모델의 경우, 모든 색을 섞으면 흰색이 되며 CMY 모델의 경우, 모든 색을 섞으면 검은색이 된다. RGB 모델을 그래프에 나타내면 다음과 같다. RGB 모델에서는 모든 색을 섞으면 흰색이 되기 때문에, 보색(complementary color) 관계는 다음과 같다. 빨간색(R)과 초록색(G)를 섞으면 노란색(Y)이 된다. R(1, 0, 0) + G(0, 1, 0) = Y(1, 1, 0) 초록색(G)과 파란색(B)를 섞으면 청록색(Cyan)이 된다. G(0, 1, 0) + B(0, 0, 1) = Cyan(0, 1, 1) 파란색(B)과 빨간색(R.. 더보기
Property of Light 태양광이나 형광등 등 일반적인 광원(light source)은 백색광(white light)를 뜻한다. 백색광에는 가시광선 영역의 보라색부터 적색에 걸친 모든 주파수 성분이 포함되어 있다. 이 빛이 물체 표면에 부딪치면 어떤 주파수 성분은 물체 내부로 흡수되는 반면, 어떤 주파수 성분은 반사된다. 반사된 빛 중 가장 많은 에너지를 지닌 파장의 주파수를 우세 주파수(dominant frequency)라고 하며, 우세 주파수의 색을 물체의 색상(hue, color)이라 한다. 채도(saturation, purity)란 색의 선명도, 혹은 순도를 말한다. 색의 채도는 빛의 세기와 빛이 얼마나 다른 파장의 영역에 걸쳐 있는지에 의해 결정된다. 가장 순수한 색은 강한 빛의 세기의 파장 중 하나를 선택해서 얻을 수.. 더보기
C에서 C++로, C++에서 다시 C로의 회귀(回歸) C++를 연구하다보면, 문득 자신이 중급자 수준으로 넘어갔다고 자각하는 때가 있다. 그것은, 코드를 작성하는 도중 발생하는 갖가지 문제를 디자인 수준에서 방어하려고 애 쓸 때이다. 개체지향 기법들이나, 수많은 관용구 기법은 빙산의 일각에 지나지 않는다. 이런 문제를 다각도로 분석한 좋은 발상과 구현들을 보면, 이미 엄청난 피와 땀이 쏟아부어졌다는 것을 느낀다. 그런데, C에서의 C++로 넘어갔을 때를 생각해보면, 어떤 이유 때문인가? 개체지향 그 자체만의 기능으로 C에서 C++를 선택한 사람은 그렇게 많지 않을 것이다. 개체지향 기능을 더 깔끔하게 구현한 언어는 이미 차고 넘친다. 대부분의 사람들은 STL의 명료함과 막강함에 매료되어 C++를 선택하지 않았을까 싶다. 현실적으로 STL 컨테이너들은 큰 도.. 더보기
volatile Qualifier and Memory Barrier 멀티스레드 상황에서, 메모리 쓰기 순서를 유지하여 오동작을 막아준다고 알려져왔던 이중 검사 동기화 패턴(double checked locking)은, 안타깝지만 모든 상황에서 제대로 동작하는 것이 아니다. CPU 런타임 시점에 이루어지는 실행 순서 재배열 문제 때문인데, 한층 더 불행한 소식은 이 문제를 방지하기 위한 volatile 한정자 선언조차 여기서 큰 도움이 되지 않는다는 점이다. C 표준에서는, volatile로 선언된 변수일 경우, 그 실행 순서가 도달하기 전까지 지정했던 동작의 완료를 보장하도록 한다. 즉, memory-mapped IO와 같은 기법에서 유용하게 쓰이며, 실제로도 그런 목적으로 고안된 것이다. 그러나, C++에서는 약간의 모호함이 있다. 즉, 실제로 volatile 선언은 .. 더보기
WTL::CString 문제 : WTL::CFileDialog Filter WTL의 CFileDialog의 필터(filter) 관련 기능은 한 가지 문제가 있다. 필터란 다들 알다시피 파일 관련 대화상자를 열었을 때, 화면에 표시할 파일의 확장자를 선택하여 그것만 보여주는 기능이다. 보통 MFC에서는 CString 형식으로, 구분자로 '|' 표시를 사용하여 정의하고 이 CString을 필터로 그냥 넘겨주면 잘 동작한다. 그러나, WTL의 CFileDialog는 WTL::CString을 사용하여 같은 방법으로 코드를 작성하면, 원하는 결과를 얻지 못한다. 이것은 WTL의 CFileDialog가 MFC와 달리 API를 래핑하는 정도로 작성되어 있기 때문이고, 또 템플릿을 사용한 코드다보니 기능 구현에 어느 정도 제약이 있기 때문이다. 즉, WTL에서는 MFC의 CString '|'.. 더보기