23-06

Sandy·2024년 3월 6일

[Today I Learned]

목록 보기
6/18

230605_RAM

SRAM

flip-flop, Cache Memory

DRAM

capacitor + transistor, Main Memory, refresh

Paging

fixed size blocks

230607_CrazyArcade

오늘 : TIL 정리하기

이슈 : AI 스터디 이번주에 하면 듣고싶다

Crazy Arcade 플레이 레포트

장르 : 2D 전략

출시 : 2001.10.16

시점 : 탑뷰

플레이 스크린샷

게임 플레이

목표 : 물풍선을 터트려서 상대방을 없애기

게임 플로우

상하좌우로 움직이면서 물풍선을 놓기

→ 부실 수 있는 블록을 부수기

→ 랜덤한 확률로 부서진 블록에서 돈 / 아이템을 얻기

→ 상대가 터진 물풍선에 갇히도록 물풍선을 놓기

레벨 디자인

공통

드랍되는 아이템, 맵의 구성, 플레이어의 속도 등으로 난이도를 조절한다.

플레이어가 물풍선으로 다른 유저를 다 죽임 → WIN

플레이어가 다른 적보다 먼저 죽음 → LOSE

PVE

Stage를 진행하며 적의 숫자, 적의 생명으로 난이도를 조절한다.

PVP

여러 명의 유저가 한 게임에 매칭해 난이도를 조절한다.


Crazy Arcade 구현 명세서

장르 : 2D 전략

시점 : 탑뷰

유사한 게임 : 봄버맨 https://namu.wiki/w/봄버맨(패미컴)

사용 기술

Map Tiling

Map Tool

Collision detection

AABB

OBB

Enemy AI

A* algorithm

카메라

follow player

UI

PerspectiveFov UI

Ortho UI

Mouse Icon

Effect

Tool

Map

NevMesh

Object

Component

Sprite

Component

Transform

Collider

Resource Management

Save

Load


코딩 가이드라인

언리얼 표준 따라가기

업무분장도

이서영 - 프로그래머

김형환 - 프로그래머

김정우 - 프로그래머

230608_Const_Reference_LRvalue

int& / const int& / int&& 차이

int& : Lvalue reference

const int& : const Lvalue reference

int&& : Rvalue reference

const int&

Lvalue / Rvalue 둘 다 담기

Rvalue 일 때 임시 객체의 lifetime이 reference 에 맞게 늘어난다

const int& as parameter

Rvalue 함수의 인자로 보내기 O

call by ref → 값 복사 X

Rvalue reference &&

move semantics

const Rvalue

rvalue : const / non const

함수 int& / int return 차이

int& : reference를 리턴 / Lvalue

int : 값을 리턴 / Rvalue

Dangling reference / Dangling pointer

존재하지 않는 것을 가리키는 것

범위 넘어가거나 delete처리 되었을 때

Reference

Alias

RAII

리소스의 lifetime을 object의 lifetime에 묶는다

std나 smartpointer로 직접 new delete 하지 않게 한다

230609_SeparatingAxisTheorem

Bounding Volume

오브젝트를 표현하는 크기

Ray Tracing

ray-intersection 테스트에 bounding volume 쓴다

Axis Aligned Bounding Box

각 축에 평행한 상자를 만들어서 충돌 체크하기

모든 축에 대해 A.max ≥ B.min 인지 체크하기

→ 한 축이라도 A.max < B.min || B.max < A.min 이면 충돌 안함

OBB Oriented Bounding Box

회전된 상자가 충돌했는지 체크한다

박스A X/Y/Z + 박스B X/Y/Z + CrossProduct XX/XY/XZ/YX/YY/YZ/ZX/ZY/ZZ

Separating Axis Theorem

convex shape에서 겹친 부분 찾기

두 개의 도형을 투영한 축에서 하나로도 겹치지 않으면 겹치지 않은 도형이다

그림자로 두 상자를 비춰서 2차원에 투영하기 → dot product로 각 축에 대한 scalar 값으로 바꾼다

1차원으로 줄여서 scalar 값 이용하기

A의 평면 3개 → 1차원 해당 평면의 Normal에 대한 값

B의 평면 3개 → 1차원 해당 평면의 Normal에 대해 값이 0

A Edge 경우의 수 3개 X B Edge 경우의 수 3개 → 두 Egde에 대해 외적해서 Normal을 만든다 : 두 Edge로 하나의 평면을 만들어서 체크한다 = 3차원을 1차원으로 만든다 → OBB랑 동일하게 모든 A B의 Vertex에 대한 min max 구하기

Separating Axis

두 개의 오브젝트가 투영한 값이 겹치지 않는 축 → 볼록한 도형이면 충돌하지 않았다

각 Edge의 노말 벡터가 체크해야하는 방향 벡터이다

SAT Collision Detection Check Axis

A 평면의 Normal 3개 + B 평면의 Normal 3개 : 평면에 닿을 때 체크

모든 축에 대한 Cross Products : Edge - Edge일 때 체크

Hyperplane Separation Theorem

Convex 두 개가 교차하지 않으면 두 개를 나누는 hyperplane이 존재한다

8-DOP

8각형 / 8면체로 된 Bounding Volume

같은 방식으로 Normal을 축으로 해서 그 축에 대해 DotProduct해서 min max 겹쳐있는지 체크한다

CONVEX HULL

가장 바깥의 Vertex들을 감싸는 Convex를 만든다

같은 방식으로 각 노말을 축으로 해서 모든 축에 대해서 겹친지 체크한다

230612_게임프로그래밍패턴

Command Pattern

입력을 객체로 캡슐화 할 때 / 실행취소, 재실행

LightWeight Pattern

간단한 작업 만들 때 / 자원관리, 충돌감지

Observer Pattern

이벤트 시스템, 상태변화 감지할 때 / 객체간의 상호작용 관리, 업데이트

Prototype Pattern

동적으로 생성되는 캐릭터, 아이템 / 기존 객체 복제해서 만들 때

Singleton Pattern

리소스 관리자, 로그 기록 / 단일 인스턴스 유지하는 객체

State Pattern

캐릭터의 상태변화 / 상태 전환 → 상태마다 특정 동작 수행할 때

Sequence Pattern

게임 특정동작, 이벤트 처리 순서대로 할 때

Chain of Responsibility Pattern

요청 보내는 오브젝트 - 받는 오브젝트 디커플링 : 여러 오브젝트가 요청 처리하도록 허용

Double Buffer

버퍼써서 깜박이지 않게 할 때 / 화면 렌더링

Game Loop

게임 로직 실행 / 입력처리 → 물리 시뮬레이션 → 그래픽 업데이트

input processing → game logic → physics simulation → graphics update

LateUpdate : 오브젝트들이 Update에서 Transform 처리한 후 해야하는 Physics LateUpdate에서 처리한다

FEngineLoop

BeginPlay() → Tick() → EndPlay()

Update Method

객체의 상태, 동작을 주기적으로 업데이트 / 이동, 애니메이션

Behavior Pattern

AI 동작, 플레이어 상호작용 / 복잡한 동작, 상호작용

Bytecode

게임엔진, 스크립트 엔진 / 실행가능한 상태로 변환해서 실행

Subclass Sandbox

외부에서 악의적인 코드 실행 방지할 때 / 하위 클래스 권한 제한

Type Object

동적 타입 시스템, 객체 동작 / 객체의 타입에 따라 동적으로 행동, 속성 변경

RTTI in UE

Runtime에 객체의 타입을 체크한다

Cast

오브젝트의 포인터 / 타입 인자로 받아서 해당하는 오브젝트 포인터나 nullptr로 돌려준다

Decoupling Pattern

컴포넌트의 의존성 낮추기, 유연성과 재사용성 높일 때

Event Queue

이벤트 처리, 메시지 전달 / 비동기적인 상호작용 구현할 때

Service Mediator

서비스 간의 통신, 상호작용 관리할 때

MVC (Model - View - Controller)

model : 데이터, 비즈니스 로직

view : 유저에게 데이터 보여준다

controller : 유저의 input 처리해서 모델과 뷰를 업데이트한다

Optimization Pattern

알고리즘, 자원관리, 그래픽 처리 최적화할 때

SOLID

Single Responsibility : 하나의 클래스는 하나의 기능을 맡기

Open-Closed : 기존 코드를 변경하지 않고 기능 추가하기

Liskov Substitution : derived가 base를 포함하게 만들기

Interface Segregation : 필요한 Interface만 넣기

Dependency Inversion : 아래 레이어 - 위 레이어를 직접 연결하면 아래 변경하면 위에도 변경한다 → abstract 한 중간 레이어 만들기

Data Locality

cache hit 늘리기 위해 데이터 모을 때

Dirty Flag

필요한 부분만 업데이트 할 때

Object Pool

자주 생성, 삭제되는 객체 재사용 할 때 / 생성, 삭제 비용 줄이기

C++ GC 없는데 쓰는 이유

오브젝트가 크다

생성/ 소멸자에서 하는 일이 많다

힙에 메모리 올리고 내리고 하면 Fragmentation 발생한다

constructor / initalizer 분리하기

Spatial Partitioning

충돌감지, 시야 계산 / 공간을 분할하기

Grid

격자 만들어서 체크하기

Tree

공간을 N개씩 나누어서 트리 구조로 저장해서 충돌 가능성 있는 것들을 나누어서 체크하기

Hash

그리드 방식인 이차원 배열 → 해시테이블을 이용해 유연한 사이즈 사용해서 체크하기

230613_D2D

D2D 솔루션 -D2DApp -D2DEngineStaticLibrary 프로젝트 생성하기

빈 실행 EXE 넣기

전에 만든 프로젝트 삭제
현재 솔루션 필요없는 리소스 삭제
D2DEngine 필터 만들어서 저장하기

🔨 Static Library로 Engine 빼기

230613_D2D_lib_primitive

🚧 프로젝트 복사해서 3에 올리기 / 충돌하기 위해서 수학 관련 파일들 생성하기

🚧 D2DEngineStaticLibrary/MathUtility.h

230614_TransformMath

🚧 수학 연산들 추가하기

Modern에서 {} initalizer가 추가된 이유

()이 함수 declaration으로 파싱된다

{}은 더 큰 타입에 자동으로 형변환이 안된다

Transformation

Actor를 움직인다

FTransform / TransformCalculus.h

Matrix.h / FMatrix

T R S

Scale → Rotate → Translate

FTransform 10 floats / Matrix 16 floats

transform 3 / rotation quaternion 4 / scale 3

FQuat

쿼터니언

Affine Space

point - point : vector

vector + point : vector

point + point : ERROR

Affine Transformation

같은 공간의 다른 점들로 매핑한다

local → world → camera → projection

Homogenous Coordinate

(x/w, y/w, z/w)

벡터의 뺄셈

A 에서 B로 가는 벡터 : -A +B

행렬의 곱셈

O(N^3)

Transform.h : FTransform

Quat.h : FQuat

Matrix.h : FMatrix

TransformVectorized.h : FTransform

RotationTranslationMatrix.h : FRotationTranslationMatrix

RotationAboutPointMatrix.h : FRotationAboutPointMatrix

ScaleRotationTranslationMatrix.h : FScaleRotationTranslationMatrix

230615_Class

Object 배열 / Object 포인터

*는 해당 Class 주소를 담는 포인터를 선언한다

  1. 포인터로 스택 영역에 생성하는 배열을 가리킬 수 있다
  2. 포인터 선언으로 힙 영역에 new 하고 그 메모리 가리키도록 할 수 있다

Instance member variable / member function

variable : 각 instance에서 자신의 copy value를 갖고있다

function : text segment에 저장된 내용을 pointer에 저장된 주소로 따라가서 호출한다

Member Function Calling

  1. 함수포인터의 값(함수의 주소)이 스택에 들어간다
  2. Program Counter 레지스터가 함수의 주소로 설정된다
  3. 함수의 코드가 실행된다
  4. 함수가 반환되면 그 주소가 스택에서 나오고 거기서 프로그램의 실행이 계속된다

Stack Frame / Call Stack

stack frame : 하나의 함수 호출에 대한 정보를 가진다

call stack : 하나의 프로그램에서 실행중인 함수들을 스택을 이용해서 저장한다

객체의 멤버 접근 this pointer

컴파일러가 obj의 주소를 함수에 argument로 넘긴다

this 필요할 때

매개변수, 멤버변수 변수명 같을 경우

객체의 매개변수 전달 방식 call by reference

컴파일러가 address를 argument로 넘기는 코드를 만든다

static member variable / static member function

data segment에 저장된다

230616_VirtualDestructor

클래스의 크기

멤버 변수의 사이즈

가상테이블 포인터 사이즈

Virtual function - 작동방식

base class에서 virtual 키워드로 써있어서 derived에서 override 할 수 있다

오브젝트가 dynamic type에 맞게 동작하게 한다

Runtime Polymorphism

여러 타입을 generic 하게 쓰기

virtual function + dynamic dispatch

컴파일타임에 정확한 타입 몰라도 된다

Compiler - virtual function

  1. 오브젝트에서 vptr 로드
  2. vptr을 이용해서 해당 객체의 클래스의 vtable 찾아감
  3. vtable에서 virtual funtion 함수 포인터 찾기
  4. function pointer로 원하는 virtual function 실행하기

Vtable

함수 포인터를 배열로 저장했다

read-only memory에 저장되어 있다

virtual function을 가진 하나의 클래스의 하나의 vtable을 갖고 있다

Virtual function / Dynamic Dispatch

virtual function : runtime polymorphism을 하기 위한 interface

dynamic dispatch : 적절한 함수를 런타임에 고르는 방식에 대한 구현

Binding

함수를 호출할 때 어떤 함수인지 메모리를 할당하는 것

static binding

compile time에 필요한 함수 바인딩 / virtual function이 아닌 member function

dynamic binding

runtime에 함수 바인딩 / virtual function

base pointer / ref일 때

virtual destructor

base pointer가 derived 오브젝트를 가리킬 때

base class의 member + virtual function만 접근할 수 있다

derived에 destrctor 있어도 base의 destructor만 부른다 → new 한 메모리 delete 안함 → memory leak

Virtual function - Memory Management

230619_이득우의게임수학

벡터의 정규화 하는 이유

벡터의 회전

삼각함수의 역함수

ToPolarCoordinate

ToCartesianCoordinate

행렬의 곱

Column major matrix / Row major matrix

Scale transformation matrix

Rotate transformation matrix

Shear transformation matrix

삼각함수의 덧셈정리를 이용한 회전

Determinant

Affine space의 필요 이유

3차원 Shear를 이용해 2차원 translate 구현

Translate transformation matrix

Affine Point

Affine Displacement vector

Affine combination

Midpoint algorithm

Line Clipping algorithm

Dot product / 삼각함수

Orthogonal matrix

Rigid Transformation (Isometry)

Rigid transform / Linear transform

내적 - 목표물 감지

내적 - 조명 모델

내적 - 투영 벡터

Convex combination

Convex region

Mesh

Vertex

Vertex buffer

Wireframe

Wireframe rendering 구현

Barycentric coordinate

barycentric coordinate rendering 구현

정점에 색상정보 추가해서 구현

Texture

Texture mapping

UV coordinate

정점에 UV값 설정, 텍스쳐 매핑 구현

Modeling matrix

Modeling matrix - Local axis

Rendering Pipeline

Drawcall

DrawMesh2D - 구현

VertexShader2D - 구현

DrawTriangle2D - 구현

FragmentShader2D - 구현

Viewport

View space

CameraObject::GetViewMatrix - 구현


Euler’s angle

Yaw / Roll / Pitch

Rotator - 구현

GetLocalAxes - 구현

TransformComponent - 구현

TransformComponent::GetModelingMatrix

CameraObject::GetViewAxes

CameraObject::GetViewMatrix

Gimbal lock

Rotational interpolation


Cross product

외적 - 평행선 판별

외적 - Normal vector

외적 - 좌우 방향 판별

외적 - 벡터로부터 회전행렬 생성

CameraObject::SetLookAtRotation - 구현

Backface culling

SoftRenderer::DrawTriangle3D - 구현

Axis-Angle rotation

Axis-Angle rotation - 구현

Scalar triple product

Vector triple product

Triple product expansion


Perspective projection transformation

Field of view

Projection plane

Normalized device coordinate

Euclidean space / Projection space

Clip coordinate

Homogenous coordinate system

CameraObject::GetPerspectiveMatrix - 구현

Frustum

CameraObject::GetPerspectiveViewMatrix - 구현

Perspective correction interpolation

Perspective correction mapping

Affine texture mapping - 구현

Perspective correction mapping - 구현

Depth buffer

Depth testing

Depth testing - 구현


Frustum culling

The equation of plane

Plane - 구현

Plane::Distance - 구현

Plane::IsOutside - 구현

Plane::Normalize - 구현

Frustum - 구현

원근 투영 행렬로 평면의 방정식을 제작해 Frustum culling - 구현

Bounding volume

Bounding volume Sphere - 구현

Mesh 정보로 구 영역 생성 - 구현

Frustum::CheckBound (Sphere)

Local bounding volume으로 절두체 컬링 - 구현

AABB - Box - 구현

Frustum::CheckBound (AABB) - 구현

Triangle clipping

PerspectiveTest (삼각형 분할) - 구현


복소수를 회전시키는 단위 복소수와의 곱

복소수와 행렬의 관계

오일러 공식

Derivative

e^x의 도함수

cos(x) / sin(x) 도함수

멱급수 기하급수와 동일한 수렴 반지금 가짐

Maciaurin series

Taylor series

오일러 공식으로 표현한 회전변환


사원수

사원수를 구성하는 세 허수

사원수의 구조

Hamilton product

Skew field

Unit quaternion

사원수 실수 + 3차원 벡터

Quaternion::RealPart

Quaternion::ImaginaryPart

사원수와 오일러 공식

Rotation quaternion

Quaternion::RotateVector

Quaternion::operator*

Quaternion::FromRotator (오일러 각에서 사원수로 변환)

Quaternion::ToRotator (사원수에서 오일러 각으로 변환)

Quaternion::GetLocalX / Y / Z (사원수에서 회전 변환행렬로 변환)

Trace

Quaternion::FromMatrix (켄 슈메이크 알고리즘)

Spherical linear interpolation

Quaternion::Slerp


Skeletal animation

Bindpose

Bone - 구현

Skinned mesh

MeshType - 구현

Weight - 구현

Rigging

TransformComponent (Hierarchical) - 구현

TransformComponent (Local / World) - 구현

Transform::LocalToWorld

Transform::Inverse

Transform::WorldToLocal

Bone (Hierarchical) - 구현

230620_VectorCrossDotProduct

이서영/DynamicArray2.cpp

✨ D2DEngineStaticLibrary/Vector2D.cpp

이서영/DoublyLinkedList.cpp

✨ D2D/D2DEngineStaticLibrary/Object.cpp SetPosition
TODO: GameProcess.cpp 에서 전체 프로세스 돌리기

🐛 include 문제 -> pch.h 만들기

Unit Vector

벡터의 크기가 1인 벡터 == Normalize() 한 벡터

방향에 대한 값만 이용하기 때문이다\

A - B

B에서 A로 가는 벡터

Dot product

벡터의 방향성이 사라지고 크기값만 남는다

연산 비용 싸다 : 곱셈 3번 + 덧셈 2번 → |a| |b| cos(seta)

단위벡터면 |a| == |b| == 1 이여서 cos(seta) 얻는 연산 → 두 벡터 사이의 관계

값 1 → 동일한 단위벡터 / 값 0 → 직교

내적 - Diffuse

Diffuse = N * L

내적 - Backface Culling

N * C > 0 → 메시의 뒷면 : 뒷면 안 그릴 수 있다

내적 - RimLight

N * C = 0 → 메시의 윤곽선

시선 벡터에 따라서 외곽선을 그릴 수 있다

근사값 사용한다

내적 - Fill Light

N * C < 0 → 메시의 앞면 : 앞면 보여서 그려야 한다

카메라가 빛을 준다

내적 + 외적 - 각도 / 방향계산

캐릭터의 방향을 클릭한 그 위치 방향으로 회전시킨다

Direction * Target = cos(seta)

왼쪽 오른쪽 외적으로 판단

역함수

내적해서 cos(seta) 값을 구했는데 여기서 seta를 구해야 한다

arcos(cos(seta)) → seta

Cross Product

두 벡터 모두에 수직인 벡터 구하기

연산 순서에 따라 방향이 바뀐다 → 교환법칙 X

부호가 나온다

Normal Vector = U X V

Normalize

Light Vector 값이 너무 커지면 하얗게 된다 → 0 ~1

230621_const_static

✨ CollisionCheck_CC D2D/D2DEngineStaticLibrary/Object.cpp

✨ CC D2D/D2DEngineStaticLibrary/Object.cpp
🚧 AABB

✨ AABB D2D/D2DEngineStaticLibrary/Object.cpp

const member function

함수가 object의 member var을 바꾸지 않는다

const qualifier

함수 호출할 때 this pointer 쓴다 거기에 const qualifer 붙혀서 포인터를 const object로 바꾼다

→ this pointer로 member 변수 못 부르고 const 아닌 member 함수 못 부른다

const instance

read-only

const member function 만 쓸 수 있다

reference lifetime / aliasing

block scope

원래 object 사라지면 dangling reference

여러 ref가 동시에 접근해서 쓸 때 aliasing 조심하기

static

Overriding X / Dynamic binding X

static 멤버 변수

객체의 멤버 X / class 기반 O

전역변수와 동일 / 클래스명으로 접근해야한다

static 멤버 함수

this X / instance variable X / overriding X

230623_MemoryLeak

🐛 SetOBB에서 DegreeToRadian 안해서 추가하기

🐛 CollisionCheck_OBB를 나눠서 Update에서 해서 CollisionCheck_OBB 첫 번째가 무시됨 -> CollisionCheck_OBB를 하나의 함수에서 다 처리

🎉 transform 프로젝트 시작하기

230623_CC.exe 추가하기

✨ LineToCircle D2D/D2DEngineStaticLibrary/Object.cpp

이서영/D2D/D2DEngineStaticLibrary/Matrix.h

3 원 - 선 업데이트 해서 4에도 업데이트 했다

Dangling pointer

할당이 해제된 메모리를 가리키는 포인터

Memory Leak

delete X / 주소 잃어버림 / 중복 할당

230624_UE5.2

Nanite

virtualized geometry

polycount, draw call, mesh memory 사용이 frame budget에 제한되지 않는다

노말맵 텍스쳐로 baking X → 높은 폴리곤의 디테일 O

Level of Detail

Static mesh

vertices animation X

Skeletal mesh

bone 갖고 있어서 vertices animation O

World Position Offset

풀 나무 본 없이 쓴다

Masked material

그림자를 opacity mask로 그린다

Preserve area 전체적 모양 유지

Displacement mapping

표면의 모양을 실제 점의 위치에 맞게 displacement map에 계산한다

Normal mapping

xyz → rgb 노말 값을 텍스쳐로 쓴다

보이는 모습만 바뀌고 실제 모양은 안 바뀐다

Height map object

grayscale image

Ragdoll physics

죽었을 때 중력의 영향을 받아 몸이 떨어진다

애니메이션 → ragdoll physics

각 부위의 rigidbody connection을 조정한다

Chaos flesh

soft body

Fluid dynamics

유체 관련 기능

Niagara Particle

파티클이 벽을 타고 흐르는 시뮬레이션

Can you pet the dog

animation + physics + skeletal structure

230626_SmartPointer

이서영/isSameString.cpp

T* const&& p

unique_ptr from const pointer

RAII

리소스의 lifetime을 object의 lifetime에 묶는다

std나 smartpointer로 직접 new delete 하지 않게 한다

Smart Pointer

raw pointer 에 추가 기능하도록 해서 객체 생성한다

unique_ptr / shared_ptr / weak_ptr

소유권

unique : 하나만 한번에 갖기

shared : 여러개 갖기 가능

weak : 소유 안함

Lifetime

unique : 범위 넘어가면 지우기

shared : 마지막 남아있는 포인터가 범위 넘어가면 지우기

weak : X

언제 쓰는지

unique : RAII

shared : 여러 오브젝트가 하나의 리소스 가질 때

weak : shared에서 원형참조 없앨 때

230627_Matrix

Unit Matrix = Identity Matrix

대각선 성분만 1이고 나머지는 0인 행렬

행렬에서 항등원

Inverse (역원)

연산을 했을 때 항등원이 나오는 것

Inverse Matrix (역행렬)

M * M^-1 = I

Transpose Matrix (전치행렬)

행과 열을 바꾸었다

j행 k열의 원소 → k행 j열의 원소

A^T

Orthogonal Matrix (직교행렬)

벡터 내적해서 0 → 모든 행, 열벡터가 직교

행렬의 곱셈

벡터의 내적을 모으기

Determinant 행렬식

D = detA = a11a22 - a12a21

D == 0 → 역행렬이 존재하지 않는다 → linear transform 에서 그 행렬변환이 축 하나를 사라지게 한다

벡터 공간이 얼마나 변하는지 / 방향이 바뀌는지

2D : 변환된 평행 사변형의 크기 3D : 변환된 평형 육면체의 부

Eigen Vector

basis 찾기

Collision in CPU

rendering pipeline만 해도 계산량이 엄청 많다
간단한 계산 연산은 cpu에서 하고 렌더링은 gpu에서 데이터 그린다

GPU 전송 후 데이터

gpu올리고 난 다음에 메인 메모리 데이터 버릴까 상황따라 다르다

gpu 데이터 접근 X → 메인 메모리에 메모리 매핑 → gpu 멈춤

콘솔 PCLe(Peripheral Component Interconnect Express) expressX 보드에 GPU 있어서 설계가 다르다

230628_Functor

Functor

함수 포인터로 함수 전달하는 것 대신 Functor를 이용해 함수를 전달한다

변수 + 함수를 전달한다

operator()를 오버로딩한 객체

함수를 호출하듯이 객체를 호출 Callable

230629_Copy_MoveConstructor

Copy Constructor

객체가 다른 객체의 값으로 초기화 될 때 자동으로 만든다

const TVector&

Shallow Copy

default copy constructor

Deep Copy

멤버 변수로 pointer가 있을 때 필요하다 (동적 메모리, 문자열)

Conversion Constructor / Conversion Function

객체의 형 변환

Copy Assignment Operator

p2 = p1에서 멤버 변수에 포인터 있을 때 같은 값 가리키기 때문에 만들어서 지원해줘야 한다

메모리 누수 가능성 체크하기 : 기존 내용 delete하기 → new로 메모리 잡기

© == this → return : 자기 자신이면 통과하기

Move Constructor

rvalue로 새로운 객체 생성할 때 호출되는 생성자

복사생성 빠르게 하기

shallow copy

소유권 이동

원본 객체 nullptr 초기화 → 접근 못한다

Move

copy X 주소만 바꿔서 이동된 효과 만들어서 성능 향상

Rvalue Reference &&

rvalue를 참조하기 위해 rvalue ref 변수를 선언한다

Rvalue

주소값을 가질 수 없는 값

Copy / Move 차이

copy : 전체 값 복사하기

move : 소유권 이동해서 새로운 객체 생성하기

Move Constructor 호출 조건

임시객체 전달

std::move()

std::move(A)

Lvalue 객체 넣으면 Rvalue ref로 변환해서 전달해준다

Destructor 있으면 Copy Constructor 만들기

heap에 할당 있는 클래스 가능성 높다

Rule of 3 / 5

destructor + copy assignment / destructor + copy + move assignment

noexcept

안 붙히면 move 에서 그 함수 안 부른다

Temporary Object

RValue : eXpiringValue + PureValue

Xvlaue : Rvale 이동 연산 가능

gvlaue : 메모리 상의 고정된 위치를 가지는 표현식

lvalue + xvalue

0개의 댓글