목록Game Dev (261)
KoreanFoodie's Study
이 강의는 유투브에 무료로 공개되어 있는 한정현 교수님의 컴퓨터 그래픽스 강좌를 정리한 글입니다. 자세한 내용은 강의를 직접 들으시거나 책을 구입하셔서 확인해 보세요. 강의 자료는 깃헙 링크에 올라와 있습니다. 요약 : 1. 그래픽스 작업 과정은 모델링 -> 리깅 -> 애니메이션 -> 렌더링 -> 포스트 프로세싱으로 나누어 볼 수 있다. 2. 실시간 그래픽스에서는 애니메이션 재생, 렌더링, 포스트 프로세싱을 처리한다. 3. 게임엔진은 그래픽스 API 를 사용하는데, 그래픽스 API 는 GPU 를 가동하는데 필요한 소프트웨어 인터페이스라고 생각하면 된다! 그래픽스 개론 컴퓨터 그래픽스의 연산은 오프라인과 런타임으로 나뉘는데, modeling 과 rigging, animation 처리는 그래픽 아티스트들이 ..
언리얼 렌더링 최적화 : Visibility 와 오클루전 컬링(Occlusion Culling) 핵심 : 1. 렌더링에는 컬링(Culling) 이라는 개념이 있다. 이 개념은, 카메라의 시점에서 보이지 않는 녀석들을 굳이 렌더링 할 필요 없이 걷어내는(Culling) 기능이라고 생각하면 된다. 액터의 Visibility 는 Bounds Scale 을 설정해 해당 액터를 카메라에 보여줄 범위를 설정할 수 있다. 2. 컬링 방법(Culling Method) 에는 크게 4 종류가 있다 : Distance, View Frustum, Precomputed Visibility, Dynamic Occulusion. 3. Culling 과 관련된 정보들은 'stat initviews' 명령어로 확인할 수 있는데, 이 ..
[언리얼] Visual Studio 한글 깨짐 (Log 한글 깨짐) 핵심 : 1. 임시 방편으로 한글 대신 영어 로그만 나오게 하기 2. 컴퓨터 환경의 인코딩 세팅을 바꾸기 (불안정) 3. cl-filter 를 수정해서 '완벽'하게 해결하기 구글링 중 세 가지 방법을 찾았고, 각각을 적용해 본 결과를 기록한다. 임시 방편으로 한글 대신 영어 로그만 나오게 하기 이 링크를 참고하자. 첫번째 방법이다. 근데 한글도 나와야 되는 상황이면... 이렇게 하면 안된다. 당근. 컴퓨터 환경의 인코딩 세팅을 바꾸기 (불안정) 이 링크의 두번째 방법을 참고하자. 절대 하지 말기. 기존 파일들 완전 다 깨진다. cl-filter 를 수정해서 '완벽'하게 해결하기 God 실력자 분이 올리신 링크를 통해 수정을 시도했다. (..
TSharedRef 를 클래스 멤버 변수로 선언할 때 에러 핵심 : 1. TSharedRef 를 선언할 때는 반드시 초기화를 해 주자. 2. TSharedRef 를 초기화할 때는 MakeShareable 보다 MakeShared 를 사용하자. 3. 초기화가 힘들면 TSharedPtr 로 선언하는 것도 대안이다. TSharedRef 를 멤버 변수로 선언할 때, 만약 헤더파일이나 생성자에서 초기화를 해 주지 않는다면 아래와 같은 에러를 만나게 된다... void EnsureRetrievingVTablePtrDuringCtor(const TCHAR* CtorSignature) { UE_CLOG(!GIsRetrievingVTablePtr, LogCore, Fatal, TEXT("The %s constructor..
TTypeCompatibleBytes 타입 핵심 : 1. TTypeCompatibleBytes 은 기본 타입이 아닌 데이터 배열로, 컴파일 타임 alignment 가 가능하다. 2. Alignment 가 되는 기본 단위는 템플릿 매개변수로 전달된 타입으로부터 계산된 사이즈로 정의된다. 3. GetTypedPtr 로 해당 Element 를 사용할 수 있다. TypeCompatibleBytes.h 에 정의된 구현을 보면, /** An untyped array of data with compile-time alignment and size derived from another type. */ template struct TTypeCompatibleBytes : public TAlignedBytes< sizeo..
언리얼 스마트 포인터 구현 세부사항과 팁 핵심 : 1. 스마트 포인터를 사용할지 고려할 때는 항상 퍼포먼스에 대해 생각해야 한다. 스마트 포인터는 자원 관리에는 적합하지만 일부 스마트 포인터 타입은 C++ 기본 포인터보다 더 느리기 때문이다. 2. TSharedPtr 는 비침범형(non-intrusive) 로, 오브젝트가 스마트 포인터의 소유 하에 있는지 알 수 없다. 오브젝트를 TSharedRef 또는 TSharedPtr 로 접근하면, 오브젝트 클래스를 TSharedFromThis 에서 파생시켜야 한다. 3. 스마트 포인터는 일반적으로 싱글 스레드에서 안전하게 사용할 수 있다. 멀티 스레드에서 사용해야 한다면, 스레드 세이프 버전을 사용하자. 스마트 포인터 구현 세부사항 언리얼 스마트 포인터 라이브러리..
TOptional 핵심 : 1. TOptional 은 인자로 들어간 녀석이 생성되었는지 아닌지 여부를 간단하게 확인할 수 있는 Wrapper 클래스이다. 2. Optional.h 에 보면 Value 와 bIsSet 이 있는데, Value 가 실제 넘기는 데이터이고, bIsSet 이 해당 데이터의 생성자가 호출되었는지 여부를 판단하는 녀석이다. IsSet, Emplace, GetValue 등을 사용하면 해당 클래스를 유용하게 활용할 수 있다. 3. TOptional 을 사용하는 장점 중 하나는, 특정 변수가 초기화되었는지를 판단하기 위해 'Magic Number' 를 쓸 필요가 없어진다는 것이다! TOptional 구조체 일단, Optional.h 에 정의된 TOptional 구조체의 대략적인 구조를 보자..
ENUM_CLASS_FLAGS 사용하기 (언리얼 플래그 사용법) 핵심 : 1. 여러 조건을 동시에 가질 수 있는 상황을 다를 때는, Enum Class 의 값을 Shift 연산자를 활용해 Bit Flag 처럼 사용하는 것이 좋다. 2. EnumClassFlags 파일에 정의된 템플릿 함수들(e.g. EnumHasAnyFlags)을 활용하면, Enum Class 에 정의된 플래그들을 이용해 케이스들의 중첩을 효율적으로 체크할 수 있다. 3. 일반적으로 Enum Class 내의 값들을 Flag 로 표현하는 경우는 UI 나 환경설정 세팅 등이 있다. 일반적으로 Enum Class 는 같은 주제 내에서 여러 조건들을 다룰 때 사용한다. 그런데 만일 여러 복합적인 상황을 동시에 다뤄야 하는 케이스가 있다고 하면 ..
TimerHandle 배열 사용하기 (TimerHandle Array) 핵심 : 1. TArray 타입을 사용하면 된다. 2. 새로운 FTimerHandle 을 넣을 때는 Emplace 를 사용한다. 3. 객체가 파괴되거나 정리하는 시점에 ClearTimer 및 배열을 비워주는 작업을 해 주자. 설명할 것은 위의 3줄 요약에서 다 했으니, 코드만 보자. // 선언 // 일정 시간 후 UTextBlock 본래 색상으로 돌아가게 만들때 사용하는 타이머핸들 TArray timerHandleList; // 구현 void UTestWidget::NativeConstruct() { for (int i = 0; i < 10; ++i) { FTimerHandle newTimerHandle; timerHandleList..
동적으로 컴포턴트 생성하기 (Dynamically create ActorComponent) 핵심 : 1. 일반적으로 ActorComponent 는 생성자에서 CreateDefaultSubobject 함수를 통해 CDO 가 생성된다. 2. 동적으로 액터 컴포넌트를 생성할 때는 두 가지 방법이 있다. 블루프린트에서는 AddComponent 함수를 사용하면 되며, C++ 에서는 NewObject 로 ActorComponent 를 생성 후, 기존 RootComponent 에 Attach 하는 방식을 활용한다. 3. 커스텀 AddComponent 함수를 만들어서 편하게 활용하거나, 템플릿 함수를 만드는 것도 좋은 방법이다. 블루프린트에서 AActor 클래스에는 AddComponent 라는, 내부적으로 NewObj..