목록Game Dev (258)
KoreanFoodie's Study
IOCP는 CPU 개수만큼만 쓰레드를 쓰는 서버이다. IOCP 를 사용한 모든 Send/Recv 는 Overlapped I/O 로 동작한다. 멀티쓰레드에서 동작하며, 콜백함수들을 동시에 동작해서 성능을 높인다. IOCP가 사용하는 IOCP 객체는 커널 안에서 관리된다. 커널 내에는 DEVICE LIST 라는 자료구조가 존재하는데, 소켓을 IOCP 에 등록하면 IOCP 객체는 DEVICE_LIST 에 소켓들을 등록해서 처리한다. 프로그래머는 DEVICE_LIST 를 직접 보거나 제어할 수 없다. 흐름을 다음과 같이 요약해 볼 수 있을 것 같다 : I/O 디바이스(소켓, FD) IOCP 에 등록 : CreateIoCompletionPrt 함수를 통해 디바이스와 CompletionPort(이하 CP) 를 바인..
이득우님의 '이득우의 게임수학' 책을 보며 좋은 내용을 정리하고 있습니다. 더 자세한 내용이 궁금하시다면, 책을 구매해 직접 읽어보시기를 추천드립니다! 변환 행렬의 역행렬 다양한 변환 행렬들의 역행렬을 알아보자. 크기 변환행렬 각 기저벡터의 크기를 각각 a, b 만큼 키우는 크기 변환행렬의 역행렬은 다음과 같다. 전단 변환행렬 평행사변형 처럼 미끄러지게 생긴 전단 변환행렬의 역행렬은 다음과 같다. 회전 변환행렬 회전 변환행렬의 역행렬은 다음과 같다. θ 만큼 반시계 방향으로 회전시키는 행렬의 역행렬을 구하기 위해서는, -θ 만큼 반시계 방향으로 회전시키는 행렬을 생각해보면 된다! 삼각함수의 성질을 이용하면 간단히 구할 수 있다.
이득우님의 '이득우의 게임수학' 책을 보며 좋은 내용을 정리하고 있습니다. 더 자세한 내용이 궁금하시다면, 책을 구매해 직접 읽어보시기를 추천드립니다! 행렬을 이용한 회전변환 행렬을 이용해 어떤 물체를 반시계 방향으로 90 도 회전시키는 행렬을 구한다고 생각해 보자. 위의 그림을 보면, 두 벡터가 다음과 같이 변환된다. 표준기저벡터 e1 : (1, 0) -> (0, 1) 표준기저벡터 e2 : (0, 1) -> (-1, 0) 따라서 반시계로 90 도 회전 변환을 수행하는 행렬을 다음과 같이 설계할 수 있다. 시계방향으로 90 도 회전을 하는 경우는 다음과 같을 것이다 : 사실 90 도 회전의 경우는 행렬을 사용하지 않고 간단하게 다음과 같이 구할 수 있다. - 시계 방향으로 90 도 회전 : (x, y) ..
이득우님의 '이득우의 게임수학' 책을 보며 좋은 내용을 정리하고 있습니다. 더 자세한 내용이 궁금하시다면, 책을 구매해 직접 읽어보시기를 추천드립니다! 극좌표계 우리는 기본적으로 데카르트 좌표계를 많이 이용하는데, 사실 회전을 할 때마다 x 와 y 의 변화를 매번 계산하는 것은 매우 번거로운 일일 수 있다. 이 경우, 원점으로부터의 거리 r 과 θ 의 두 요소로 구성된 극좌표계(Polar coordinate system) 을 사용할 수 있다. 일반적으로 arctan 함수를 이용하면 벡터의 각도를 얻어낼 수 있는데(tanθ = y/x 이므로, θ = arctan(y/x) 이 됨), arctan 함수는 치역이 -180도에서 180도까지 밖에 되지 않는다. 따라서 이를 해결하기 위해, x 와 y 값을 따로 전..
이득우님의 '이득우의 게임수학' 책을 보며 좋은 내용을 정리하고 있습니다. 더 자세한 내용이 궁금하시다면, 책을 구매해 직접 읽어보시기를 추천드립니다! 삼각함수를 활용한 물체의 회전 삼각함수를 통해 물체를 회전하면 좌표값이 어떻게 변할까? 먼저, 다음과 같이 좌표 (1, 1) 을 θ 만큼 반시계 방향으로 회전하면, 다음과 같이 그려지게 된다. 위에서, 벡터 v 는 기저 벡터 e1 와 e2 의 합으로 표현되며, 이를 각 θ 만큼 회전 시킨 녀석을 (cosθ - sinθ, sinθ + cosθ) 로 표현할 수 있음을 알 수 있다. 동일한 원리로, 임의의 벡터 (x, y) 를 각 θ 만큼 회전시켜 (x', y') 를 구해보자. 식은 다음과 같이 쓸 수 있다. 기저벡터를 활용하면, 임의의 벡터 u 를 각 θ 만..
먼저 Message Pump 란, 한 메시지를 처리하는 도중 메시지 큐로부터 다른 메시지를 꺼내 이를 처리하는 코드를 의미한다. 윈도우 어플리케이션의 경우, UI 및 사용자 입력 처리하는 과정에서 메시지 펌프를 적극 활용하고 있다. 기초적인 Message Loop 코드는 다음과 같다. MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } 그런데 GetMessage 의 경우 데드타임(메시지큐에 메시지가 없어 GetMessage 가 놀고 있는 시간)을 제대로 활용할 수 없어, PeekMessage 를 많이 활용한다. PeekMessage 는 메시지 큐에 메시지가 있든 없든 리턴을 하기 때문..
Actor 와 ActorComponent 유니티에서는 게임 오브젝트 아래에 게임 오브젝트를 넣는 식으로 Hierarchy 를 만들어낼 수 있다. 하지만 언리얼은 그런 식으로 동작하지 않는다. 유니티에서는 항공기가 있다고 했을 때, 프리팹에 각종 게임 오브젝트를 하위에 넣어 조합하는 방식으로 해당 오브젝트를 제작할 수 있다. 그런데 언리얼에서 Actor 는 Bucket 같은 개념으로, 다양한 액터 컴포넌트를 담고 있다. 즉, 언리얼은 Bucket 안에 다른 Bucket 을 넣는 방식으로 오브젝트를 생성하지 않는다. 액터 컴포넌트는 재사용가능한 기능을 정의하는 컴포넌트에 대한 베이스 클래스로 충돌, 메시, 월드 이동, 소리 재생, 빛과 명암 등의 다양한 기능을 지원한다. 언리얼에서는 트랜스폼을 가진 액터 컴..
언리얼 코딩 표준 명명규칙 : 파스칼케이스, 접두사(U - UObject 상속 /A - AActor 상속 /S - SWidget 상속 / C - 에픽의 개념이 유사 / b - 부울 변수 / F - 그 외 대부분) 포터블 C++ 코드 : bool(크기 추정 금지, BOOL 은 컴파일 안됨), TCHAR, uint8, int8, uint(16, 32, 64 버전) , float, double, PTRINT(포인터를 가질 수 있는 정수, 크기 추정 금지) 표준 라이브러리 사용 : 표준 컨테이너와 스트링은 interop 코드를 제외하고 사용하지 말아야 함 코멘트 : 코드는 구현을 설명하고, 코멘트는 그 의도를 설명한다. 최신 C++ 언어 문법 : static_assert 사용, override 및 final 사..
언리얼 가비지 컬렉터(GC) 심화 정리 언리얼 엔진은 Reference Graph 를 만들어 오브젝트들의 사용 여부를 구분한다. 이 그래프 루트에는 "Root Set" 이라고 지정된 오브젝트 셋이 있으며, "Root Set" 에 포함된 객체들은 GC 대상에서 제외된다(Mark & Sweep 방식으로 추적). 세 가지 규칙 : UPROPERTY 선언 : 클래스 내부 멤버 변수가 클래스의 객체의 수명과 운명을 함께할 경우 선언 멤버가 가리키는 포인터 : 엔진이 인식하거나 관리하지 않는 메모리 영역을 가리키도록 만들면 안됨 TArray 를 활용 : UObject 또는 자식들에 대한 포인터를 안전하게 담을 수 있는 유일한 컨테이너 기타 인터페이스 예시 : // Object 를 살아있게 만드는 3가지 방법; //..
MVC 패턴 개요 MVC 패턴은 앱을 Model, View, Controller 로 나누어 데이터와 로직을 분리하는 디자인 패턴이다. Model은 데이터를 가진 객체를, View는 사용자가 볼 결과물을 생성하는 컨테이너를, Controller는 사용자가 Model 과 View 를 호출하는 로직이다. 이때, Model 과 View 는 Controller 의 존재를 몰라야 결합도를 줄일 수 있다. Model 에 변경 사항이 생기면 View 는 Controller 를 통해 이벤트가 실행되어 화면이 업데이트 된다. MVC 패턴은 비즈니스 로직과 UI 로직을 분리하여 유지 보수를 독립적으로 수행할 수 있고, 확장성과 유연성이 뛰어나다는 장점이 있다. 하지만 하나의 컨트롤러에 다수의 View 와 Model 이 복잡..