목록Categories (1104)
KoreanFoodie's Study

슬레이트 구조 (아키텍처) 사실 언리얼에는 이미 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 상태는 어떠한지 등을 한눈에 파악할 수 있다(위젯 리플렉터 : 창 > 개발자 툴 > 위젯 리플렉터). 더 자세한 사항은 이득우님 블로그의 에디터 확장 기초 글을 참고하자. 위의 히트 테스트 가능 위젯을 누르면, 다음과 같이 플레이 화면과 위젯 리플렉터 창이 바뀌는 것을 확인할 수 있다(이미지는 공식 문서에서 가져옴) 해당 위젯의 계층 구조를 파악할 수 있으며, 실시간으로 위젯을 끄고 킬 수도 있어 위젯 관련 디버깅에 매우 유용한 기능이다!

Asio 는 Asynchronous IO 의 약자이다. Asio 를 이해하기 위해서는, 다음과 같은 용어들을 알고 있어야 한다. IO Service 클래스 : 커널에서 발생한 입출력 이벤트를 디스패치 해주는 기능을 수행. 디스패치란, 우선순위가 높은 작업이 우선적으로 수행될 수 있도록 시스템 자원을 할당하는 것을 의미한다. IO Service 클래스는 커널에서 발생한 네트워크상의 접속 및 데이터 처리 이벤트를 처리한다. 종단점(Endpoint) : 네트워크 상의 특정 컴퓨터에서 실행되고 있는 하나의 프로그램. 구체적으로 IP 주소와 포트 번호의 한 쌍을 종단점이라고 함. DNS(Domain Name Server) : Boost Asio 에서는 도메인 주소를 이용, IP 주소를 알아내어 종단점을 구한다. ..

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 만큼 키우는 크기 변환행렬의 역행렬은 다음과 같다. 전단 변환행렬 평행사변형 처럼 미끄러지게 생긴 전단 변환행렬의 역행렬은 다음과 같다. 회전 변환행렬 회전 변환행렬의 역행렬은 다음과 같다. θ 만큼 반시계 방향으로 회전시키는 행렬의 역행렬을 구하기 위해서는, -θ 만큼 반시계 방향으로 회전시키는 행렬을 생각해보면 된다! 삼각함수의 성질을 이용하면 간단히 구할 수 있다.

약 두 달간 읽으며 정리하고 요약한 Effective C++ 와 Effective Modern C++ 게시글들에 대한 리스트 요약글입니다. 개발하실때 참고하시길 바라며, 직접 사서 읽어보시길 강추드립니다! 1장 형식 연역 항목 1: 템플릿 형식 연역 규칙을 숙지하라 항목 2: auto의 형식 연역 규칙을 숙지하라 항목 3: decltype의 작동 방식을 숙지하라 항목 4: 연역된 형식을 파악하는 방법을 알아두라 2장 auto 항목 5: 명시적 형식 선언보다는 auto를 선호하라 항목 6: auto가 원치 않은 형식으로 연역될 때에는 명시적 형식의 초기치를 사용하라 3장 현대적 C++에 적응하기 항목 7: 객체 생성 시 괄호(())와 중괄호({})를 구분하라 항목 8: 0과 NULL보다 nullptr를 선..

약 두 달간 읽으며 정리하고 요약한 Effective C++ 와 Effective Modern C++ 게시글들에 대한 리스트 요약글입니다. 개발하실때 참고하시길 바라며, 직접 사서 읽어보시길 강추드립니다! Chapter 1 C++에 왔으면 C++의 법을 따릅시다 항목 1: C++를 언어들의 연합체로 바라보는 안목은 필수 항목 2: #define을 쓰려거든 const, enum, inline을 떠올리자 항목 3: 낌새만 보이면 const를 들이대 보자! 항목 4: 객체를 사용하기 전에 반드시 그 객체를 초기화하자 Chapter 2 생성자, 소멸자 및 대입 연산자 항목 5: C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 항목 6: 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 ..

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 42 : 삽입 대신 생성 삽입을 고려하라 핵심 : 1. 이론적으로, 생성 삽입 함수들은 종종 해당 삽입 버전보다 더 효율적이어야 하며, 덜 효율적인 경우는 절대로 없어야 한다. 2. 실질적으로, (1) 추가할 값이 컨테이너에 배정되는 것이 컨테이너에 배정되는 것이 아니라 컨테이너 안에서 생성되고, (2) 인수 형식(들)이 컨테이너가 담는 형식과 다르고, (3) 그 값이 중복된 값이어도 컨테이너가 거부하지 않는다면, 생성 삽입 함수가 삽입 함수보다 빠를 가능성이 아주 크다. 3. 생성 삽입 함수는 삽입 함수라면 거부당했을 형식 변환들을 ..