# Game Engine Architecture

### 블리치 바이패스

* **원래 의미**:
  * 필름 현상 과정에서 은염(흑백 정보)을 제거하는 '표백(Bleach)' 과정을 **건너뛰는(Bypass)** 방식.
  * 이로 인해 필름에 은염이 남아 있어, 이미지의 **흑백 정보와 색상 정보가 동시에 표현**됩니다.

1. **고대비 이미지**:
   * 밝은 부분은 더욱 밝게, 어두운 부분은 더욱 어둡게 표현됩니다.
2. **낮은 채도**:
   * 색상이 감소하여 흑백에 가까운 색감을 가집니다.
3. **시각적 느낌**:
   * 색이 강조되지 않아 현실적이고 차가운 느낌.
   * 무거운 감정이나 극적인 분위기를 전달할 때 효과적.

### 스마트 포인터

스마트 포인터는 동적 메모리 관리를 자동화하기 위해 만들어진 특수한 포인터 클래스입니다. C++에서는 일반적으로 동적 메모리 할당(new/delete)이 필요한 상황에서 이를 직접 관리해야 하는데, 이 과정에서 메모리 누수와 같은 문제가 발생할 수 있습니다. 스마트 포인터는 이를 방지합니다.

스마트 포인터의 역할

* 동적 메모리를 자동으로 관리.
* 객체의 소유권과 수명을 추적.
* 메모리 누수 방지.

> 그럼 이것만 쓰면 gc 필요없는거 아님?

스마트 포인터만 사용하면 Garbage Collector(GC)가 필요 없다고 생각할 수 있지만, 이는 완전히 사실은 아닙니다.

순환 참조(Circular Reference):

* 두 객체가 서로를 std::shared\_ptr로 참조하면, 참조 카운트가 0이 되지 않아 메모리 해제가 이루어지지 않습니다. 이 문제를 해결하기 위해 std::weak\_ptr를 사용해야 하지만, 프로그래머가 직접 관리해야 합니다.

객체 수명 관리가 필요 없는 경우

* 스마트 포인터는 객체의 소유권을 관리하기 때문에, 단순히 일시적인 참조만 필요한 경우(예: 특정 함수에서 사용 후 제거될 임시 객체)에 사용하면 불필요한 오버헤드가 발생합니다

객체가 아닌 다른 자원

* 스마트 포인터는 동적 메모리(힙)에 할당된 객체를 관리합니다. 파일 핸들, 소켓, GPU 리소스 등 비메모리 자원은 스마트 포인터로 관리되지 않으므로 수동 관리가 필요합니다.

### 소스 파일, 헤더 파일, 번역 단위

소스 파일 : c++로 작성한 프로그램. 번역 단위 (translation unit) 라고도 부르는데, 컴파일러가 한 번에 기계어 코드로 바꾸는 단위이기 때문.

헤더 파일 : 특수한 형태의 소스 파일. 타입 선언, 함수 프로토타입 같은 정보를 번역 단위 간에 공유하는 데 쓰임. 컴파일러는 헤더 파일이 존재하는지 모름. c++ 전처리기가 컴파일에 앞서 모든 #include 구문을 헤더 파일로 교체하기 때문.

### 라이브러리, 실행 파일, 동적 링크 라이브러리

번역 단위 1개가 컴파일된 결과물인 기계어는 목적(object) 파일에 저장됨.

목적 파일 안의 기계어 특성

* **재배치 가능** 코드가 위치할 메모리 주소가 아직 결정되지 않은 상태
* **링크되지 않음** 번역 단위 안에 들어 있지 않은 외부 참조 함수나 전역 데이터가 아직 확정되지 않음.

목적 파일 여러 개 묶은게 '라이브러리'.

목적 파일과 라이브러리는 링커를 거쳐 실행 파일로 변환되는데, 이 과정을 '링크한다'고 말함. 컴파일러에서 안 정했던 메모리 주소 값이나 외부 참조를 확정한 상태의 기계어가 실행 파일. 실행 파일은 운영체제에서 로드하고 실행 가능.

실행 파일의 기계어 코드는 여전히 relocatable함. 모든 기계어와 데이터를 가리키는 메모리 주소는 절대 주소가 아니라 기준 값에 더해질 상대 값이라는 뜻.

동적 링크 라이브러리 (DLL, Dynamic Link Library) 는 라이브러리의 한 종류인데, 정적 라이브러리와 실행 파일의 중간 형태를 띰. 함수 담고 있다는 점에선 라이브러리와 같고, 운영체제가 따로 로드한다는 점은 실행 파일과 같음. 시작과 끝 처리 코드 있다는 것도 실행 파일과 유사.

실행 파일이 DLL 쓰려면 부분적으로 링크된 (partially linked) 기계어 코드가 있어야 함. 링크 거치면 대부분 메모리 주소 결정되는데 DLL 함수 참조는 결정 안됨. 나중에 실행 파일 실행 할 때 운영체제에서 참조 결정 안된 함수 찾아서 필요한 DLL을 메모리에 로드.

실행 파일과 상관 없이 DLL만 교체할 수 있다는 점에서 매우 유용.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lazyartisan.gitbook.io/note/main-page/books/game-engine-architecture.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
