2024/04 25

원형 리스트

static int ListNum = -1; class List { public: List* CurPtr = this; List* BeforePtr = nullptr; List* AfterPtr = nullptr; int Index = 0; int Value = 0; bool IsDummy = false; ~List(); }; // 빈 List 생성 void InitialList(); // 원하는 만큼의 수와 해당 값으로의 초기화된 List 생성 void InitialList(int MaxIndex, int Value); // 부분 삭제 void DeleteIList(int iter, List* InDeleteList); // 전체 삭제 void DeleteAllList(); // 삽입 void Push..

DX11 HongLap - 빛의 반사

구의 Reflection 수치 값을 변경해주기 전이다. 구 1개만 반사 적용 구 2개에 반사광 적용 바닥까지 반사광 적용 이는 레이트레이싱을 이용한 반사광 적용이다. 반사되는 횟수가 많아질수록 고성능을 요구하기 때문에 컴퓨터 사양에 따라 좀 느려지기도 한다. 해당 이론은 Bilinear Interpolation즉 이중선형 보간과 관련이 있다. 우리는 해당 그림을 통해서 먼저 두개의 선형 보간을 수행하여 a와 b를 계산한 다음 a와 b를 보간하여 c를 찾을 수 있다. c는 당연히 (tx , ty)의 값을 가지게 될 것이다. 이중선형 보간은 일반 2D 그리드의 임의 위치에 있는 값을 알아야 할 때 사용된다. 이 그리디는 이미지나 텍스처 맵에 사용될 수 있다. 이 예에서는 녹색 점으로 표시된 위치(좌표 cx,..

그래픽스/DX11 2024.04.17

DX11 - HongLap 수퍼 샘플링

수퍼 샘플링의 이론은 해당 지점에 도달한 레이 픽셀을 다시 N개로 나누어 쏴준다 해당 픽셀의 N개의 레이를 다시 쏴맞추는 효과로 인해 그 하나의 픽셀 안에서 N개의 평균을 낸 뒤 해당 픽셀 값을 도출해내는 샘플링이다. 슈퍼 샘플링이란 샘플링할 때 즉, 하나만 샘플링만 하는 것이 아니라 추가로 샘플링을 하여 평균을 낸다라는 아이디어는 기본적으로 동일하나, 방법은 여러가지 방법이 있다.

그래픽스/DX11 2024.04.17

주소 바인딩

주소 바인딩이란? 프로세스는 실행을 위해 메모리에 적재되면 프로세스를 위한 독자적인 주소공간이 생긴다.이 주소를 논리적 주소라고 한다. 논리적 주소는 각 프로세스마다 독립적으로 할당된다. 그렇다면 프로세스는 왜 논리적 주소를 사용할까? CPU가 프로세스의 작업을 수행하기 위해서 프로세스의 논리적 주소를 참조하게 된다.논리적 주소만으로는 실제 메모리의 주소를 알 수 없기 때문에논리 주소를 물리적 메모리로 연결시키는 작업이 필요하다.이 작업을 주소 바인딩이라고 한다. 주소 바인딩의 종류로는컴파일 타임 바인딩로드 타임 바인딩실행 시간 바인딩이렇게 세 가지의 바인딩 방식이 있다.세 바인딩의 기준은 물리적 주소가 언제 결정되느냐에 따라 결정된다.  컴파일 타임 바..

에라토스테네스의 체를 응용한 소수 사이 수열 3896

2부터 n까지의 소수를 구할 때 에라토스테네스의 체를 이용한 방법은 아래와 같다.2부터 시작해서 n까지 진행한다.가장 작은 수를 선택한다.그 작은 수를 소수라고 가정하고 작은 수부터 n까지 그 작은 수의 배수를 모두 제거한다. //에라토스테네스의 체로 1000까지의 소수 출력하기 #include #include using namespace std; int main(){ int n = 1000; int check[1001] = { false }; check[0] = check[1] = true; for (int i = 2; i > x; i..

L-value, R-value

L-value와 R-value는 copy, move와 관련이 있다. 주소값을 가지고 있는 친구는 L-value이다. 즉 L-value는 callable한 변수, R-value는 한번 쓰고 다시 안쓰는 변수를 말한다. int a = 3; a = b; 여기서 a,b는 L-value, 3은 R-value라고 생각하면 편하다. 좌측값 참조자는 &, 우측값 참조자는 &&이다. 한번쓰고 버려질 것이면 copy보단, move가 적절하게 사용할 것이고, callable한 것은 copy가 더 적절할 것이다. 이를 vector를 예시로 하게된다면 void push_back (const T& value); void push_back (T&& value); 좌측값 참조를 사용하게 된다면, stack에 가리키는 주소의 메모리가..

구조체 바이트 패딩 규칙

단순 클라이언트의 작업만을 생각했을 땐 구조체 혹은 클래스의 순서를 중요하게 생각하지 않았었다. 하지만 서버에서는 구조체, 클래스의 패딩 규칙이 중요하다 이에 따라서 구조체 전체 크기가 달라지기도 하기 때문이다. 구조체를 이용하여 새로운 자료형을 정의하여 사용할 때, 정의된 자료형은 컴파일러에 의해 데이터로 변환되고, 이어서 메모리에 저장된다. 컴퓨터 프로세서가 메모리에 '어떤 방식'으로 접근하여 데이터를 읽어가고 컴파일러가 프로그램 코드를 '어떤 규칙'으로 데이터로 변환하는지를 확인하여 보자 이를 통해, 처리속도가 빠르고 효율적으로 메모리를 사용하는 자료형을 구성할 수 있을 것이다. 1. 빈 구조체 혹은 클래스는 4바이트의 메모리 공간을 차지하게 된다. 2. 먼저 나열한 순서 대로 메모리 공간을 순차적..

const int *, const int* const, int* const

int const * int const * 는 const int 형을 가리키는 포인터로 포인터 값은 변경(주소 변경)이 가능하므로 다른 것을 가리킬 수 있으나 내부의 int 값은 const로 선언되어 변경이 불가능하다. int* const int* const 는 const 포인터가 int형을 가리키고 있으므로 포인터의 값(주소)은 변경이 불가능하고 내부의 int형으로 표현된 값은 변경이 가능하다. const int* const 는 가리키는 주소와 주소 내부의 값 모두 상수화 한 것이다.

코어와 멀티코어, 스레드와 멀티스레드

코어와 멀티코어 클럭 속도를 높이는 방법 외에 CPU의 성능을 높이는 방법으로 대표적인 해결책으로는 CPU의 코어와 스레드 수를 늘리는 방법이 있다. 전통적인 CPU에는 코어가 하나였지만, 오늘날에는 코어를 여러 개 포함하고 있는 CPU를 멀티코어 CPU 또는 멀티코어 프로세서라고 부른다. 이는 CPU 내에 명령어를 처리하는 일꾼이 여러 명 있는 것과 같다. 당연히 멀티코어의 처리 속도는 단일코어보다 빠르며, 가령 클럭 속도가 2.4GHz인 단일 코어 CPU와 클럭 속도가 1.9GHz인 멀티코어 CPU를 비교하면 일반적으로 후자의 성능이 더 좋다. CPU 종류는 CPU 안에 코어가 몇 개 포함되어 있는지에 따라 싱글코어, 듀얼코어, 트리플코어 드응로 나뉜다. 즉 멀티코어 프로세서란 여러 개의 코어를 포함..