본문 바로가기

전체 글

(34)
렌더링 파이프라인 렌더링 파이프라인은 게임 상의 3D 월드를 2D 화면으로 출력하는 방법이다. 과정 로컬 스페이스 → 월드 스페이스 → 뷰 스페이스 → 후면 추려내기 → 조명 → 클리핑 → 투영 → 뷰포트 → 래스터라이즈 로컬 스페이스 : 물체를 표현할 때 기준이 되는 좌표계이다. 자체 좌표계를 이용한다. (월드 고려 X) 월드 스페이스 : 물체의 로컬 좌표를 월드상의 좌표로 변환한다. 뷰 스페이스 : 카메라를 월드 상의 원점으로 삼고, 카메라를 기준으로 물체들이 회전하는 영역이다. 후면 추려내기 : 일반적으로 카메라는 폴리곤의 후면을 볼 수 없기 때문에 불필요한 후면 폴리곤을 잘라내서 렌더링에서 제외한다. 조명 : 광원은 월드 스페이스 내에 정의되지만 뷰 스페이스 변환 시 변환된다. 물체에 명암을 추가한다. 클리핑 : ..
더블 버퍼링과 스왑 체인 더블 버퍼링에 대해 질문을 받았는데 스왑 체인 썼던 것밖에 기억이 안나서 스왑 체인에 대해서 설명해도 되겠냐고 물어보고 설명을 했었다. 지금 생각해보니 API 때는 (스왑체인이 아닌) 더블 버퍼링, DirectX 때는 스왑 체인 방식을 썼었는데 API 배워놓고서 까먹었던 것 같다. 더블 버퍼링 화면이 갱신될 때마다 깜빡거리는 현상을 방지하기 위해 back buffer(오프 스크린)에 먼저 이미지를 그리고, 이미지가 완성되면 기존 화면(실제 화면)에 옮겨그리는 방법이다. 스왑 체인 스왑 체인도 더블 버퍼링의 일종이다. front buffer와 back buffer 두 개를 가지면서 실제 화면에는 front buffer를 출력하고 이미지는 back buffer에 그리는 방식이다. 포인터를 통해 접근하며 ba..
게임에 디자인 패턴 적용하기 1. 싱글톤 패턴 (Singleton Pattern) 가장 많이 사용한 패턴이다. 주로 키 입력 매니저, 타임 매니저 등 하나만 있으면 되는 매니저 클래스를 만들 때 사용했다. 예를 들어 싱글톤으로 사운드 매니저를 만든 경우, 플레이어나 몬스터 등의 클래스에서 효과음이 필요할 때 마다 사운드 매니저로부터 인스턴스를 얻어와 소리를 재생하는 방식을 썼다. 장점 : 편한 글로벌 액세스 제공, 단일 인스턴스 보장, 처음 액세스 시 생성되므로 객체 생성 시간이 적음 단점 : 개방 - 폐쇄 원칙에 어긋남, 높은 결합도를 가짐, 멀티 쓰레드 환경에서 동기화 처리를 하지 않으면 인스턴스가 두 개 이상 만들어질 가능성이 있음 2. 추상 팩토리 패턴 (Abstract Factory Pattern) API 배울 때 다양한 ..
디자인 패턴을 사용하는 이유 디자인 패턴을 사용하는 이유는 두 가지로 나눌 수 있다. 1. 협력 디자인 패턴은 범용적인 코딩 스타일이기 때문에 팀 프로젝트인 경우, 디자인 패턴을 사용하면 팀원들이 코드를 직관적으로 쉽게 이해할 수 있다. 2. 유지보수 기존 코드의 문제점에 대해 검증된 방법으로 해결 방안을 찾을 수 있다.
정적 바인딩, 동적 바인딩, 가상 함수 테이블 컴파일을 하면 코드에서 함수를 호출하는 부분에 해당 함수가 저장된 메모리 주소 값이 저장된다. 프로그램 실행 → 함수 호출 → 함수가 저장된 주소로 점프 → 함수 실행 → 원래 위치 노란 표시를 한 부분이 바인딩(Binding)이다. 바인딩은 함수 호출 시 함수가 저장된 메모리 주소로 연결시켜주는 것이다. 정적 바인딩 동적 바인딩 바인딩이 결정되는 시점 컴파일 컴파일 시 주소를 저장할 메모리 공간(4bytes)만 가지고 있다가 런타임에 결정 할당하는 것 일반 함수 가상 함수 장점 속도가 비교적 빠름, 안정적 실행 도중 호출하므로 유연함 단점 유연하지 않음 예상치 못한 타입의 경우 안정적 가상 함수 테이블 클래스에 가상 함수가 하나라도 있다면 컴파일러는 메모리 어딘가에 가상 함수 테이블을 만들고, 해당 클..
클래스, 추상 클래스, 인터페이스 비교 클래스 추상 클래스 인터페이스 키워드 class abstract class interface 기능 필드와 메서드로 이루어진 객체 추상 메서드를 하나 이상 가진 클래스, 자식 클래스에 대해 오버라이딩 강제 메서드의 선언부만 가짐, 모든 메서드가 추상 메서드라서 상속받은 클래스는 반드시 구현해야함 변수 선언 가능 가능 불가능 함수 선언 가능 가능 가능 함수 구현 가능 추상 메서드 구현 불가능 불가능 객체 생성 가능 불가능 불가능 목적 객체를 나타내기 위한 틀 코드의 재사용 및 확장 반드시 구현해야하는 요구사항 상속 가능 여부 부모 클래스 (행) → ↓자식 클래스 (열) 일반 클래스 추상 클래스 인터페이스 일반 클래스 O O (오버라이딩 필수) O (오버라이딩 필수) 추상 클래스 O O O 인터페이스 X X ..
메모리 영역 낮은 주소 → 높은 주소 코드 - 데이터 - BSS - 힙 - 스택 코드 데이터 BSS 힙 스택 가지고 있는 값 함수, 제어문, 상수 초기화된 global, static 변수, 배열 초기화되지 않은 global, static 변수, 배열 사용자가 동적 할당한 변수 지역 변수, 매개 변수 크기 결정 시점 컴파일 타임 런타임 소멸 결정 시점 프로그램 종료 시 명시적으로 할당 해제하는 경우에만 블록을 빠져나갈 때 저장 방향 낮은 주소에서 높은 주소 방향 높은 주소에서 낮은 주소 방향 힙 스택 장점 큰 메모리 풀이므로 큰 배열/구조체/ 클래스 할당 가능, 사용자가 관리할 수 있음 메모리 할당이 비교적 빠름, 비교적 크기가 작음 단점 메모리 할당이 비교적 느림, 메모리 릭 발생 가능 , 포인터를 통해 접근하게 되..
BFS 구현 (큐) 그래프는 이 블로그에서 가져온 그림을 참고했다. #include #include #include // To measure execution time #define SIZE 9 using namespace std; void BFS(vector _graph[], bool _visit[]) { queue bfsQueue; bfsQueue.push(1); int currentIndex = 0; while(!bfsQueue.empty()) { currentIndex = bfsQueue.front(); _visit[currentIndex] = true; cout