23-10

Sandy·2024년 3월 6일

[Today I Learned]

목록 보기
10/18

231010_ViewTM

Lerp / Slerp

Slerp : 쿼터니언이 회전이기 때문에 휘어진 곡선, 면을 따라서 점에서 점을 연결하도록 한다.

View TM

카메라가 (0, 0, 0) 에 위치하는 것처럼 모든 버텍스의 좌표를 변환시킨다. 월드에서 카메라의 위치가 있다. 그 위치만큼 빼주는 것과 유사하게 역행렬을 적용하면 된다.

View TM - 카메라 오브젝트 변환의 역변환

카메라 오브젝트가 가지고 있는 매트릭스가 있다. 거기에 inverse 연산을 해서 역행렬을 곱한다.

View TM - 기저벡터를 이용

오브젝트의 기저에 카메라-1을 해서 각 오브젝트의 기저를 바꿔준다. 원점인 카메라를 중심으로 다른 오브젝트가 배치된다.

따라서 둘 다 동일한 의미이다.


카메라 XYZ 벡터 만드는 방법

카메라 XYZ벡터는 전부 Normalize 되어있어서 크기가 1이다.

카메라도 월드에서 위치를 가진다. 타겟인 오브젝트도 위치를 가진다. 오브젝트 - 카메라를 하면 카메라에서 오브젝트로 가는 카메라→오브젝트 벡터가 나온다. 그 벡터가 Z 벡터이다.

Z벡터가 있으면 월드의 Y벡터와 외적을 해서 카메라의 X벡터를 구할 수 있다.

마지막으로 얻은 카메라의 X벡터와 Z벡터를 외적해서 Y벡터를 구할 수 있다.

오브젝트 - 카메라 → 카메라 Z 벡터

(카메라 Z벡터) X (월드의 Y벡터) → 카메라 X 벡터

(카메라 Z벡터) X (카메라 X벡터) → 카메라 Y 벡터

따라서 카메라의 LookAtVector + 월드의 UpVector로 카메라의 Rotation Matrix를 구할 수 있다.

231025_obj삼각형

ERR : obj 파일을 읽는데 f에서 삼각형으로 안 해놓아서 제대로 나오지 않았다. 그래서 다각형을 쪼개는 알고리즘을 찾다가 다른 방법이 있을 것 같았다.

SOL : 블랜더에서 export 할 때 옵션에서 삼각형으로 내보내기를 체크해야 했다.

231026_스레드

reference_wrapper

참조를 받지 않는 벡터에 참조 넣기 → 객체로 포장해서 넣기

스레드 생성해야 하는 경우 :

유저가 프로세스가 멈추었다고 느끼지 않게 백그라운드에서 실행해야 할 때 별도의 스레드로 분리한다.

Socket listener : 네트워크 관련 IO를 하는 부분은 다른 스레드를 쓴다.

Loading Resource : 텍스쳐, 3D모델, 사운드 등 크기가 큰 것을 올릴 때 쓴다.

Rendering : update → render을 분리한다. 병렬적으로 처리해서 render는 이전 update의 데이터를 쓴다. 1프레임 전을 render 한다.

Game Thread : Poll input / Update AI / Animation / Physics

Render Thread : Ready structure / Cull Objects / Forward Pass / Postfix

스레드 생성하지 말아야 하는 경우 :

여러 스레드를 이용해 하나의 사용자 인터페이스를 만들 필요가 없다. 사용자는 한 명이고 한 번에 하나의 입력이 들어온다.

concurrency : 서로 다른 시스템들이 영향을 주고받고 선형적으로 쭉 진행되어야 하는 부분에서는 오히려 맞추는데 시간이 걸린다.

너무 많은 스레드 : 루프를 나눌 때 많은 파이프 라인으로 나눠서 기능별로 스레드로 분리한다. 파이프라인으로 많은 단계를 1프레임씩 늦춰서 하면 입력이 밀리는 느낌을 받을 수 있어서 update / render의 단계로만 분리하는 것이 나은 편이다.

2D : 스프라이트로 그리는 간단한 게임이면 싱글 스레드로 한다.

스레드 종료 방법

1 스레드 함수 반환

2 스레드 함수 내에서 ExitThread()

3 프로세스에서 TerminateThread()

4 스레드가 포함된 프로세스 종료

1번을 추천한다. 스레드 함수가 반환되면 수행되는 작업이 있기 때문이다.

Object destructor : 갖고있던 오브젝트 리소스를 해제해준다

스택 메모리 : 함수를 부르면서 스택으로 사용한 메모리를 반환한다.

스레드 종료 코드 : 종료 코드가 반환 값으로 설정 → 스레드 커널 오브젝트에 저장

사용 카운트 : 스레드 커널 오브젝트 사용 카운트가 감소된다.

2 ExitThread 문제점 :

Object destructor (X)

스택 메모리(O)

스레드 종료 코드 (O)

3 TerminateThread 문제점

스택 메모리(X)

스레드 종료 코드 (O)

사용 카운트(O)

4 프로세스 종료 문제점

Object destructor (X) 하지만 사용하던 메모리 정리하거나 저장 안하고 다 날린다.

스택 메모리(O)

231028_Entity component system

컴포넌트 시스템 - 컴포넌트끼리 통신

이벤트 통해서 다른 컴포넌트에게 알리기

이벤트가 컴포넌트끼리 통신할 때 데이터를 넘겨주는 역할을 한다.

가운데에서 메시지를 처리해 준다.

Entity

GameObject

Unique ID를 각 오브젝트마다 가진다

Component

특정 기능을 하도록 속성을 갖게 한다

System

엔티티가 갖고있는 컴포넌트를 동작하게 한다

0개의 댓글