목록Categories (1099)
KoreanFoodie's Study
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 4 : 객체를 사용하기 전에 반드시 그 객체를 초기화하자 핵심 : 1. 기본제공 타입의 객체는 직접 손으로 초기화하자. 2. 생성자에서는, 생성자 본문 내무에 데이터 멤버에 대한 대입문을 넣지 않고 초기화 리스트를 사용하자. 또한 데이터 멤버가 선언된 순서와 똑같이 나열하자. 3. 여러 번역 단위에 있는 비지역 정적 객체들의 초기화 순서 문제는 피해서 설계해야 한다. 비지역 정적 객체를 지역 정적 객체로 바꾸면 된다. 생성자를 다음과 같이 쓰는 것은, 생성과 동시에 '초기화' 하는 것이 아닌, '대입'을 행하는 것이다. class Us..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 3 : 낌새만 보이면 const 를 들이대 보자! 핵심 : 1. const 를 붙여 선언하면 컴파일러가 사용상의 에러를 잡아내는 데 도움을 준다. const 는 어떤 유효범위에 있는 객체에도 붙을 수 있으며, 함수 매개변수 및 반환 타입에도 붙을 수 있으며, 멤버 함수에도 붙을 수 있다. 2. 컴파일러 쪽에서 보면 비트수준 상수성을 지켜야 하지만, 우리는 개념적인(논리적인) 상수성을 사용해서 프로그래밍해야 한다. 3. 상수 멤버 빛 비상수 멤버 함수가 기능적으로 서로 똑같게 구현되어 있을 경우에는 코드 중복을 피하는 것이 좋은데, 이때..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 2 : #define 을 쓰려거든 const, enum, inline 을 떠올리자 핵심 : 1. 단순한 상수를 쓸 때는, #define 보다 const 객체 혹은 enum 을 우선 생각하자. 2. 함수처럼 쓰이는 매크로를 만들려면, #define 매크로보다 인라인 함수를 우선 생각하자. 항목 2의 핵심은, 가급적 선행 처리자보다는 컴파일러와 친하게 지내는 게 좋다는 것이다. 다음과 같은 예를 보자. #define ASPECT_RATIO 1.653 위의 경우, 해당 부분을 디버깅할 때, ASPECT_RATIO 는 컴파일러가 쓰는 기호 테..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 1 : C++ 를 언어들의 연합체로 바라보는 안목은 필수 핵심 : 1. C++ 를 사용한 효과적인 프로그래밍 규칙은, C++ 의 어떤 부분을 사용하느냐에 따라 달라진다! C++ 을 이루고 있는 하위 요소 (Building Block) 은 크게 4 가지이다. C (C 에는 템플릿도 없고, 예외도 없고, 오버로딩도 없다) 객체 지향 개념의 C++ (클래스를 쓰는 C 에 관한 모든 것들. 캡슐화, 상속, 다형성, 가상함수 등) 템플릿 C++ (템플릿 메타 프로그래밍까지) STL (container, iterator, algorithm, fu..
이득우님의 '이득우의 게임수학' 책을 보며 좋은 내용을 정리하고 있습니다. 더 자세한 내용이 궁금하시다면, 책을 구매해 직접 읽어보시기를 추천드립니다! 삼각함수를 활용한 물체의 회전 삼각함수를 통해 물체를 회전하면 좌표값이 어떻게 변할까? 먼저, 다음과 같이 좌표 (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가지 방법; //..
UML (Unified Modeling Language) UML 에는 Class, Sequence, Use Case, Component 등 다양한 종류가 있지만, 여기서는 주로 Class 와 Sequence 다이어그램을 정리한다. 클래스 다이어그램 (Class Diagram) 클래스들 사이의 관계는 다음과 같이 표현될 수 있다(참고 링크). 각 관계를 조금 더 자세히 기술하면 다음과 같다. 관계 표시 설명 연관 관계 (association) 실선이나 화살표 연관 관계는 오랜 시간 동안 같이할 객체와의 관계를 나타낸다(e.g. 자동차와 소유자의 관계) 보통 클래스의 속성(멤버 변수)에서 참조할 때 연관 관계를 가진다. 단방향 연관 관계의 경우, 화살표를 사용하여 클래스를 참조한다. 양방향 연관 관계의 경우..