C/C++
- 가변 길이 템플릿(variadic template)
- template <typename T, typename... Types>
=> typename 뒤에 ... 으로 오는 것을 "템플릿 파라미터 팩"이라고 부른다.
=> 템플릿 파라미터 팩의 경우 0개 이상의 템플릿 인자들을 나타낸다.
- void Print(T arg, Types... args)
=> 함수의 인자에 ... 으로 오는 것을 "함수 파라미터 팩" 이라고 부른다.
=> 함수 파라미터 팩의 경우 0개 이상의 함수 인자를 나타낸다.
- 파라미터 팩은 추론된 인자를 제외한 나머지 인자들을 나타낸다.
- C++ 규칙 상, 파라미터 팩이 없는 함수의 우선순위가 더 높다.
- C++ 컴파일러는 함수를 컴파일 시에, 자신의 앞에 정의되어 있는 함수들 밖에 보지 못한다.
=> 템플릿 함수를 작성할 때 그 순서에 유의해야 한다.
- sizeof...
- sizeof 연산자는 인자의 크기를 리턴하지만 파라미터 팩에 sizeof... 을 사용할 경우 전체 인자의 개수를 리턴하게 된다.
- Fold Expression
- Fold 형식을 사용하면 가변 길이 템플릿을 훨씬 간단하게 사용할 수 있다.
=> C++ 11에서 도입된 가변 길이 템플릿은 재귀 함수 형태로 구성하기 때문에, 반드시 재귀 호출 종료를 위한 함수를 따로 만들어야 했다.
- C++ 17에서 지원하는 Fold 방식의 종류는 총 4가지가 있다.
- 일반화 프로그래밍(generic programming)
- 템플릿을 통해서 타입이 마치 인자 인것 처럼 사용하는 것
- 템플릿 메타 프로그래밍(TMP)
- 타입은 반드시 컴파일 타임에 확장되어야 하므로, 컴파일 타임에 모든 연산이 끝나게 된다.
=> 타입을 가지고 컴파일 타임에 생성되는 코드로 프로그래밍 하는 것을 "메타 프로그래밍"이라고 한다.
=> C++의 경우 템플릿을 가지고 이러한 작업을 하기 때문에 "템플릿 메타 프로그래밍(TML)"라고 부른다.
- TMP 사용 이유
- TMP로 작성된 코드는 모두 컴파일 타임에 모든 연산이 끝나기 때문에 프로그래밍 실행 속도를 향상 시킬 수 있다. ( ↔ 당연히 컴파일 시간은 매우 늘어난다.)
=> 이론상 어떠한 C++ 코드도 TMP로 변환할 수 있다.
- TMP는 매우 복잡하기 때문에 프로그램 전체를 TMP로 구현하는 일은 없다.
=> 또한, TMP로 작성된 코드는 버그를 찾는 것이 매우 힘들다.
==> 컴파일 타임에 연산하는 것이기 때문에 디버깅이 불가능함.
==> C++ 컴파일러 특성 상 템플릿 오류 시에 엄청난 길이의 오류를 출력함.
- 속도가 매우 중요한 프로그램의 경우 TMP를 통해서 런타임 속도도 향상시킬 수 있다.
- 의존 타입(dependent type)
- 템플릿 인자에 따라서 어떠한 타입이 달라질 수 있는 것을 "의존 타입"이라 부른다.
- 단위(Unit) 라이브러리
- '-auto' 키워드
- 컴파일러가 타입을 정확히 알아낼 수 있는 경우 굳이 타입을 적지 않고 간단히 auto 키워드로 표현할 수 있다.
=> auto에 해당하는 타입은 컴파일 시에 컴파일러에 의해 추론된다.
DirectX 11
- 깊이 복잡도(depth complexity)
- 깊이 복잡도는 후면 버퍼의 특정 항목에 기록되기 위해 경쟁하는(깊이 판정을 통해서) 픽셀 단편들의 개수를 의미한다.
- 장면에 따라서는 그래픽 카드가 매 프레임마다 하나의 픽셀을 여러 번 그리게 된다. 이것을 겹쳐 그리기(overdraw)라고 한다.
=> 겹쳐 그리기는 성능에 악영향을 준다.
==> 어차피 다른 픽셀 단편에게 덮어쓰여서 보이지 않게 될 픽셀을 처리하느라 시간을 낭비하기 때문이다.
- 성능 분석을 위해서는 한 장면의 깊이 복잡도를 측정해 보는 것이 도움이 된다.
- 깊이 복잡도를 측정하는 한 가지 방법은 보통의 방법으로 장면을 렌더링하되, 스텐실 버퍼를 계수기(counter)로 사용하는 것이다.
=> 렌더링 시작 시 스텐실 버퍼를 0으로 지운다.
=> 장면을 렌더링하되, 각 픽셀 단편이 처리될 때마다 해당 스텐실 버퍼 항목이 1씩 증가하게 된다.
==> D3D11_STENCIL_OP_INCR 적용
=> 또한, 모든 픽셀 단편에 대해 개수를 증가시켜야 한다.
==> 비교함수로 D3D11_COMPARISION_ALWAYS 적용
- 깊이 복잡도를 측정하는 것이 주된 목적인 경우에는 장면을 스텐실 버퍼에만 렌더링해도 된다.
- 스텐실 버퍼에 담은 깊이 복잡도를 시각화 하는 방법이 있다.(446p)
- 깊이 판정은 픽셀 셰이더 단계의 다음 단계에서 발생한다.
=> 정확히는 출력 병합기 단계에서 발생함.
=> 현세대 그래픽 하드웨어들은 깊이 판정을 픽셀 셰이더보다 먼저 수행하는 '이른 Z 판정(early Z-test)'을 적용한다.
==> 이른 Z 판정을 적용하면 어차피 폐기될 단편을 비싼 픽셀 셰이더로 처리하기 전에 제외시킨다.
==> 이른 Z 판정 최적화의 이점을 취하려면 장면의 비혼합 물체들을 카메라 기준 앞에서 뒤로 그려야 한다. (이러면 깊이 복잡도가 낮아짐)
=> 이른 Z 판정은 D3D API로 직접 제어 불가능함.
==> 그래픽 구동기(드라이버)가 결정함.
ex) 픽셀 셰이더가 픽셀 단편의 깊이 값을 수정한다면 이른 Z 판정이 불가능함. 이른 Z 판정이 일어나는 시점에서는 이후에 픽셀 셰이더가 깊이 값을 어떻게 수정할 것인지 미리 알 수 없기 때문임.
C++에 대한 내용은 씹어먹는 C++ 강좌를 보고 공부한 내용입니다.
'TIL' 카테고리의 다른 글
[TIL] 20230118 성장일지 (0) | 2023.01.18 |
---|---|
[TIL] 20230112 - 20230117 성장일지 (0) | 2023.01.18 |
[TIL] 20230110 성장일지 (0) | 2023.01.11 |
[TIL] 20230106 성장일지 (0) | 2023.01.07 |
[TIL] 20230105 성장일지 (0) | 2023.01.06 |
댓글