목록Categories (1099)
KoreanFoodie's Study
이 병은 예고도 없이 찾아온다. 한 번 왔다고 해서 다시 찾아오지 않는 것도 아니며, 이미 겪어 보았다고 해서 더 견디기 쉬워지는 것도 아니다. 그냥 공허함이 내 몸속을 파고든다. 햇살의 줄기, 그 속에 담긴 입자 하나하나가 내 몸 속 깊은 곳까지 파고들듯이, 공허의 알갱이들은 깊숙히 내 속으로 휘몰아친다. 나는 그 녀석이 올 때마다, 곧 넘쳐 흐를 것만 같이 부글거리는 냄비를 든 아이처럼 어쩔 줄을 몰라 한다. 따뜻해야만 할 가족들의 웃음소리가 마치 싸구려 골판지가 우그러지는 소리처럼 느껴지고, 사랑하는 사람과 함께한 시간은, 마치 대여기간이 정해진 소꿉놀이처럼 느껴지게 만드는 불치병. 지독한 병을 조금이라도 달래기 위해, 환자는 오늘도 연인의 시간을 빌려쓰려 휴대폰을 들어 밝은 목소리를 꾸며낸다.
inline 과 FORCEINLINE 의 차이 사실 이 둘의 차이는 이미 단어에서 쉽게 파악할 수 있다. 일단 함수의 인라인화라는 것은, 컴파일러가 함수 바디를 컴파일 타임에 붙여 넣어 함수 호출의 오버헤드를 줄이는 최적화 방식이라고 볼 수 있다. C++ 에서 inline 은 컴파일러에게 함수를 인라인화할 것을 '요청' 한다. 이는 '명령' 이나 '강제'가 아니다. 복잡한 함수나 가상함수는 컴파일러가 인라인화 해주지 않으며, inline 키워드를 쓰지 않더라도 작고 간단한 함수의 경우 컴파일러가 알아서 인라인화를 해 주기도 한다. 반면 FORCEINLINE 은 말 그대로 강제적으로 인라인화를 시킨다. 생성자와 소멸자 등, 인라인화 시키기에 적합하지 않은함수들이 생각보다 많이 존재하므로, FORCEINLI..
C++ 에 대해 공부한 것과, 개발하면서 알게 된 것들을 다룹니다 RTTI RTTI 는 간단히 말해, 실시간 타입 정보라는 뜻이다. RTTI 라는 단어를 평소에는 잘 들어볼 일이 없다가, dynamic_cast 를 사용하기 위해 비주얼 스튜디오 옵션을 뒤적이던 중 해당 항목을 발견했다. 알다시피, C++ 는 리플렉션 기능을 제공하지 않는다. C# 에서는 리플렉션을 제공하는데, 해당 기능은 런타임에서 클래스 타입, 메소드, 프로퍼티 등의 메타 정보를 제공해 준다. 비주얼 스튜디오에서는 해당 기능을 끄고 킬 수 있게 만들어 놓았다. 간단히 말해, 해당 기능을 키게 되면 런타임에서 타입에 대한 정보를 얻을 수 있다. RTTI 는 가상 함수가 있는 클래스에 대해서만 동작하며, 이는 클래스의 타입 관련 정보가 v..
C++ 에 대해 공부한 것과, 개발하면서 알게 된 것들을 다룹니다 파생 클래스에서의 기반 클래스 생성자 호출 사실 파생 클래스가 생성될 때, 기반 클래스 생성자가 호출된다는 건, C++ 을 조금이라도 해 본 사람은 누구나 알고 있는 사실이다. 또한 함수의 생성자/소멸자의 호출 순서가 다음과 같다는 것도, 익히 알려진 사실이다. 즉, A 클래스가 기반 클래스이고, B 클래스가 파생 클래스라고 가정했을 때 B 클래스 변수를 선언하면 호출 순서가 다음과 같이 나올 것이다 : A 클래스 생성자 B 클래스 생성자 B 클래스 소멸자 A 클래스 소멸자 하지만 한 가지 기억해야 할 것은, 파생 클래스를 만들 때 호출되는 기반 클래스 생성자는 '인자가 없는 기반 클래스의 생성자' 이다. 즉, 인자를 받는 형식의 기반 클..
C++ 에 대해 공부한 것과, 개발하면서 알게 된 것들을 다룹니다 우측값과 좌측값 우리는 C++03 까지, 우리는 우측값과 좌측값 두 가지의 개념을 사용하여 코딩을 했었다. 간단히 말하자면, 좌측값은 '식의 좌측에 있는 변수'를, 우측값은 '식의 우측에 있는 값'을 의미했다. // a 는 좌측값, 5 는 우측값이다 int a = 5; 흔히들 좌측값을 '이름이 있는 녀석'으로 인식하기도 했다. 엄밀히 말하면 틀린 말은 아니다. 그런데 move semantics 가 도입되기 시작하면서, C++11 부터 대격변이 시작되는데... 여기서 많은 사람들이 좌측값과 우측값에 대한 개념을 헷갈려하기 시작한다(필자 포함). move semantics 가 뭔지 잘 모르겠다면, 이전 글(기초, 응용, 심화)을 꼭 읽고 오자..
C++ 에 대해 공부한 것과, 개발하면서 알게 된 것들을 다룹니다 const_cast 많은 사람들이 알고 있듯이, C++ 에서 제공하는 casting 의 종류는 크게 4 가지이다. 각 용도를 간단히 적어보면 다음과 같다 : static_cast : '일반적인' C 스타일의 캐스팅. 보통 업캐스팅(파생 클래스의 포인터를 기반 클래스의 포인터로 가리킴) 시 사용한다. dynamic_cast : 상속 관계에 있는 클래스들 사이의 캐스팅. 보통 다운 캐스팅(기반 클래스의 포인터를 파생 클래스의 포인터로 가리킴) 시 사용한다. 만약 실패하면 nullptr 를 리턴한다. 참고로, dynamic_cast 는 polymorphic 한 클래스만 가능한데, 간단히 말하면 virtual 함수가 포함된 클래스이어야 dynam..
슬레이트 구조 (아키텍처) 사실 언리얼에는 이미 UMG 라는, 매우 편리한 위젯 관련 툴이 존재한다. 하지만 코드로 UI 를 컨트롤할 수 있다는 장점 때문에, 실제로 많은 곳에서 슬레이트(Slate) 를 활용하고 있다. 슬레이트는 어떤 녀석이고, 어떻게 디자인되어 있는지, 공식 문서(번역본)를 통해 먼저 간단하게 짚고 넘어가도록 하자! 이번 글에서는 슬레이트가 추구하는 방향과 철학에 대해 다룬다. 일단, 에디터 인터페이스의 대부분은 슬레이트로 제작되어 있다. Contents Browser 뿐만 아니라 블루프린트 에디터, 애니메이션 에디터 등 엔진 인터페이스의 대부분을 차지하고 있다. 슬레이트는 다음과 같은 접근법을 사용한다 : (불투명 캐시와 중복 스테이트를 피하기 위해. 전통적으로 UI 는 스테이트를 ..
UUserWidget 의 Native 함수 //native SObjectWidget methods (see the corresponding BlueprintImplementableEvent declarations above for more info on each) friend class SObjectWidget; virtual void NativeOnInitialized(); virtual void NativePreConstruct(); virtual void NativeConstruct(); virtual void NativeDestruct(); virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime); UserWidget 에는 위..
더티 플래그 패턴이란? 더티 플래그 패턴에 대해서는, 이전 블로그 글에서 간단하게 언급한 바 있다. 더티 플래그 패턴은 일반적으로 렌더링 과정에서, 계층 구조가 존재할 경우, 필요할 때 / 필요한 타이밍에 화면을 갱신하는 부분에서 자주 쓰인다. 또한 더티 플래그를 체크해 UI 를 갱신하게 되면, Tick 마다 UI 업데이트가 중복해서 일어나는 것을 막을 수 있다. 그렇다면 이 패턴을 언리얼에서는 어떤 방식으로 적용해 볼 수 있을까? 예를 들어, 우리가 어떤 UI 를 갱신 하는데,Dirty Flag 를 두어 해당 더티 플래그가 켜져 있을 때만 UI 를 갱신한다고 가정해 보자. 일단, 실제로 UI 클래스를 만들기 전에, 더티 플래그 패턴을 사용할 위젯들이 공통적으로 사용할 인터페이스를 다음과 같이 정의할 수..
위젯 리플렉터 언리얼의 위젯 리플렉터 기능을 이용하면, 현재 플레이하고 있는 창에서 어떤 위젯이 어떤 블루프린트를 사용하고 있는지, visibility 상태는 어떠한지 등을 한눈에 파악할 수 있다(위젯 리플렉터 : 창 > 개발자 툴 > 위젯 리플렉터). 더 자세한 사항은 이득우님 블로그의 에디터 확장 기초 글을 참고하자. 위의 히트 테스트 가능 위젯을 누르면, 다음과 같이 플레이 화면과 위젯 리플렉터 창이 바뀌는 것을 확인할 수 있다(이미지는 공식 문서에서 가져옴) 해당 위젯의 계층 구조를 파악할 수 있으며, 실시간으로 위젯을 끄고 킬 수도 있어 위젯 관련 디버깅에 매우 유용한 기능이다!