<aside> ▫️ 추상화 vs 캡슐화
추상화
클래스로 만들어, 함수로 만들어
캡슐화
숨겨, private로 선언해, getter/setter로 데이터 접근해
</aside>
<aside> ▫️ Closure
컴파일러는 모든 람다 표현식을 자동으로 함수 객체로 변환한다. 이를 람다 클로저라 부르며, 컴파일러가 생성한 고유 이름을 갖는다. - PC++, p1004
(Lexical) Closure. 클로저는 함수가 선언될 당시의 환경(environment)을 기억했다가 나중에 호출되었을때 원래의 환경에 따라 수행되는 함수이다. 이름이 클로저인 이유는 함수 선언 시의 scope(lexical scope)를 포섭(closure)하여 이후 실행될 때 이용하기 때문이다. - 클로저 - 나무위키 (namu.wiki)
</aside>
<aside> ▫️ Continuous Integration CI란 무엇입니까? - 지속적 통합 설명 - AWS (amazon.com)
소프트웨어 개발에서 각 소프트웨어 개발자가 작업한 변경점을 프로젝트의 원래 소스 코드에 자주, 빠르게 통합하는 것이다. 이를 위해 CI를 위한 각종 개발도구와 스크립트를 사용해 코드를 합치고 품질을 검사하며 테스트하는 과정을 자동화한다. 덕분에 사람이 직접 해야 하는 일이 줄어들고 문제가 생겼을 때 빨리 발견할 수 있다.
소스 코드로부터 설치, 실행할 수 있는 제품을 생성하여 배포하는 과정인 Continuous Delivery와 함께 묶어 CI/CD라고 부른다.
</aside>
<aside> ▫️ RHI
RHI는 Rendering Hardware Interface의 약자로, 그래픽스에서 다양한 하드웨어를 효율적으로 사용할 수 있도록 돕는 추상화 계층입니다. 이 인터페이스는 개발자가 특정 하드웨어에 구애받지 않고 그래픽스를 구현할 수 있게 해줍니다. RHI의 주요 역할과 특징을 몇 가지로 나누어 설명하겠습니다.
예를 들어, Unreal Engine의 RHI는 다양한 플랫폼에서의 그래픽스 구현을 단순화합니다. 개발자는 DirectX, Vulkan, Metal 등 특정 API를 직접 다룰 필요 없이, RHI를 통해 추상화된 그래픽스 인터페이스를 사용할 수 있습니다. 이렇게 함으로써, 개발자는 특정 플랫폼에 얽매이지 않고 보다 광범위한 사용자에게 도달할 수 있는 애플리케이션을 개발할 수 있습니다.
RHI는 그래픽스 개발에서 필수적인 구성 요소로, 하드웨어의 복잡성을 감추고 개발자의 생산성을 높이며, 다양한 플랫폼에서 일관된 성능을 제공하는 데 기여합니다. 이를 통해, 그래픽스 개발은 보다 효율적이고 확장 가능해집니다.
</aside>
<aside> ▫️ 밉맵의 목적은 텍스처링 시 발생하는 에일리어싱 문제를 해결하는 것이다. - G3G, p190
</aside>
<aside> ▫️ [언리얼]
Owner: 게임 오브젝트의 상호작용과 논리적인 소유권을 나타내는데 사용된다. 예를 들어, 캐릭터가 발사하는 프로젝타일의 “Owner”는 그 프로젝타일을 발사한 캐릭터이다. Outer: Unreal Engine의 객체가 포함된 더 큰 객체를 나타내는 용어로, 객체의 메모리 구조나 계층에서 상위에 위치한 객체를 의미한다.
Owner는 주로 게임 오브젝트의 상호작용과 논리적인 소유권을 나타내는 데 사용됩니다. 예를 들어, 캐릭터가 발사하는 프로젝타일의 "Owner"는 그 프로젝타일을 발사한 캐릭터입니다. Owner는 게임의 로직에 따라 설정되며, 주로 해당 오브젝트가 누구에 의해 생성되었는지를 추적하는 데 사용됩니다.
Outer는 Unreal Engine의 객체가 포함된 더 큰 객체를 나타내는 용어로, 객체의 메모리 구조나 계층에서 상위에 위치한 객체를 의미합니다. 객체가 생성될 때, 모든 Unreal 객체는 "Outer" 객체를 가질 수 있으며, 이는 일반적으로 객체가 속한 컨텍스트 또는 컨테이너를 나타냅니다.
이 두 개념을 이해하고 올바르게 적용하는 것은 Unreal Engine에서 객체의 관계와 상호작용을 효과적으로 관리하기 위해 중요합니다.
</aside>
<aside> ▫️ "푸시 기반" 복제 모델이란, 변경사항이 발생할 때마다 자동으로 해당 데이터를 관련된 시스템이나 사용자에게 즉시 전송하는 방식을 말합니다. 이는 시스템이 능동적으로 데이터를 "푸시" 하여 업데이트를 제공함으로써, 데이터의 최신 상태를 유지할 수 있게 합니다. 반대로 "풀링 기반" 모델에서는 클라이언트가 주기적으로 서버에 데이터 업데이트를 요청해야 합니다. 푸시 기반 모델은 효율성과 반응 속도 면에서 이점을 제공합니다.
</aside>
<aside> ▫️ [언리얼] 월드 컴포지션 := 월드 파티션
</aside>
<aside> ▫️ 객체지향 프로그래밍의 4가지 특징 추상화, 상속, 다형성, 캡슐화
</aside>
<aside> ▫️ 리플렉션 데이터란 클래스의 런타임 정보에 대한 설명을 뜻한다. 여기에는 클래스의 이름은 무엇인지, 어떤 데이터 멤버들을 포함하는지, 데이터 멤버의 타입은 무엇인지, 객체의 메모리 이미지에서 각 멤버의 오프셋은 어떻게 되는지, 클래스의 멤버 함수는 어떤 것이 있는지 등이 저장된다. - GEA 1122
</aside>
<aside> ▫️ ‘실제’ C++ 클래스 인스턴스를 바이너리 이미지로 저장하는 것은 여러 문제가 있는데, 포인터와 가상 테이블을 예외적으로 처리해야 하는 문제와 클래스 인스턴스 내 데이터의 엔디언을 처리해야 하는 문제 등이 있다. - GEA 1120
</aside>
<aside> ▫️ 직렬화(serialization)란 어떤 객체가 랜덤 액세스(random access) 가능한 형태로 메모리상에 존재할 때, 이를 일련의 여러 비트로 변환하여 길게 나열하는 것을 말한다. 변환된 비트열을 디스크에 저장하거나 네트워크를 통해 전송하면 추후 원래 형태로 복원할 수 있다.
</aside>
<aside> ▫️ 리플렉션은 어떤 객체의 타입뿐 아니라 그 객체의 클래스가 어떤 속성과 메서드를 지원하는지를 런타임에 동적으로 알 수 있는 시스템이다
</aside>
<aside> ▫️
UV 매핑에서 "패킹(packing)"이란 3D 모델의 텍스처 좌표를 텍스처 공간 안에 최대한 효율적으로 배치하는 과정을 말합니다.
</aside>
<aside> ▫️ 언리얼 엔진에서 월드 z축 기준으로 회전하기 위한 회전 행렬
$$ R_z=\begin{bmatrix} \cos\theta&\sin\theta&0&0\\ -\sin\theta&\cos\theta&0&0\\ 0&0&1&0\\ 0&0&0&1 \end{bmatrix} $$
</aside>
<aside> ▫️ 색의 세 가지 속성
<aside> ▫️ 변환 행렬과 역행렬
$$ S=\begin{bmatrix} a&0\\ 0&b \end{bmatrix} $$
$$ S=\begin{bmatrix} 1&a\\ 0&1 \end{bmatrix} $$
$$ R_\theta=\begin{bmatrix} \cos\theta&-\sin\theta\\ \sin\theta&\cos\theta \end{bmatrix} $$
$$ S^{-1}=\begin{bmatrix} 1\over{a}&0\\ 0&1\over{b} \end{bmatrix} $$
$$ S^{-1}=\begin{bmatrix} 1&-a\\ 0&1 \end{bmatrix} $$
$$ R_\theta^{-1}=\begin{bmatrix} \cos\theta&\sin\theta\\ -\sin\theta&\cos\theta \end{bmatrix} $$
회전행렬의 역행렬은 전치연산과도 같다. $R_\theta^{-1}=R_\theta^{T}$ - 이게수, p184
</aside>
<aside> ▫️ 표준기저벡터의 선형 결합으로 형성된 벡터 공간은 선형성을 지닌다. 이 벡터 공간을 선형 함수로 변화시킨 새로운 공간도 기저벡터의 선형 결합으로 형성되므로 선형성을 지닌다. 이렇게 두 공간이 동일한 구조를 지닐 때 두 공간의 대응 관계를 변환(Transformation)이라고도 부른다. - 이게수, p160
</aside>
<aside> ▫️ 함수 $f$에 대해,
함수 $f$는 선형이라고 한다. - 이게수, p155
</aside>
<aside> ▫️ 선형 연산을 사용해 $n$개의 스칼라 $a_1, ..., a_n$과 $n$개의 벡터 $\vec{v_1},...,\vec{v_n}$을 결합해 새로운 벡터 $\vec{v'}$을 생성하는 수식을 선형 결합(Linear combination)이라고 한다. 선형 결합의 수식은 다음과 같다. - 이게수, p106
$$ a_1\vec{v_1}+a_2\vec{v_2}+a_3\vec{v_3}+\cdots+a_n\vec{v_n}=\vec{v'} $$
</aside>
<aside> ▫️ 벡터 공간 내 모든 벡터를 생성할 수 있는 선형 독립 관계를 가지는 벡터의 집합을 기저(Basis)라고 한다. - 이게수, p111
</aside>
<aside> ▫️ Vector2를 사용하는 과정에서 벡터와 스칼라와의 연산은 빈번히 발생하기 때문에, 스택Stack 공간에서 데이터를 처리하는 데 중점을 두는 키워드인 구조체 struct를 사용해 선언했다. - 이게수, p92
</aside>
<aside> ▫️ [언리얼] 런타임에 별도로 조정하지 않는 한 플레이어 컨트롤러의 위치는 절대 바뀌지 않는다
</aside>
<aside>
▫️ 값에 의한 전달 (TArray<SomeType> SomeArray
)
이 방식에서는 함수에 배열을 전달할 때 배열의 복사본이 생성됩니다. 즉, 함수 내에서 이 배열을 수정하더라도 원본 배열에는 영향을 주지 않습니다. 이 방식의 단점은 큰 배열을 복사할 때 추가적인 메모리 할당과 복사 비용이 발생한다는 것입니다. 따라서, 주로 배열의 크기가 작거나 함수 내에서 배열의 수정 없이 읽기만 할 경우에 적합합니다.
참조에 의한 전달 (TArray<SomeType>& SomeArray
)
참조에 의한 전달에서는 함수로 전달되는 배열이 원본 배열에 대한 참조로, 함수 내에서 이 배열을 수정하면 원본 배열에도 영향을 줍니다. 이 방식은 추가적인 복사 비용 없이 큰 데이터를 효율적으로 처리할 수 있게 해줍니다. 하지만, 함수가 배열을 변경할 수 있으므로 함수의 사이드 이펙트에 대해 주의해야 합니다. 퍼포먼스가 중요하거나 큰 데이터를 다룰 때, 또는 함수 내에서 데이터의 수정이 필요한 경우에 적합합니다.
</aside>
<aside> ▫️ 두 벡터사이의 각을 구할 때 내적 공식
$$ \bold{a}\cdot\bold{b}=\lVert\bold{a}\rVert\lVert\bold{b}\rVert\cos{\theta} $$
</aside>
<aside> ▫️ x보다 큰 y의 최소 배수는
$$ x+(y-x\bmod{y}) $$
</aside>
<aside> ▫️ "Opt-in" 방식은 사용자가 특정 서비스나 프로그램에 명시적으로 동의하거나 참여를 선택해야 하는 절차를 말합니다. 이는 기본적으로 사용자가 아무런 조치를 취하지 않으면 참여하거나 동의한 것으로 간주되지 않는 방식이며, 사용자가 직접 참여를 선택하거나 동의를 해야만 서비스를 이용하거나 정보를 받을 수 있습니다. 예를 들어, 이메일 마케팅에서는 수신자가 뉴스레터 구독을 명시적으로 선택해야만 이메일을 받을 수 있는 경우가 이에 해당합니다. Opt-in 방식은 개인정보 보호 및 사용자의 선택권을 존중하는 관점에서 중요한 개념입니다.
</aside>
<aside>
▫️ const 키워드는 왼쪽을 기준으로 동작한다. T const * var
는 상수 변수의 포인터이다. 주솟값이 바뀔 수 있다. T* const var
는 상수 포인터 변수이다. 주솟값이 바뀌지 않는다.
</aside>
<aside> ▫️ 8bit == 1byte
</aside>
<aside> ▫️ 탄젠트 공간: 정점의 접면과 노멀이 이루는 공간
</aside>
<aside> ▫️ 그람-슈미트 공정 결과는 기존 기저의 부분공간에 포함되면서 서로 수직이다.
</aside>