목록언리얼 엔진/기능 (31)
게임 개발 메모장
UMG (Unreal Motion Graphic) ( 언리얼의 비주얼 UI 저작 툴 ) UWidget UI에서 가장 기본이 되는 최상위 부모 클래스 SlateWidget을 TWeakPtr로 래핑 UPanelWidget 자식을 가질 수 있지만, UWidget은 자식을 가질 수 없음 패널은 주로 레이아웃을 잡는 용도로 사용 (CanvasPanel, VerticalBox 등) 실제로 화면에 그려지는 건 위젯 (Image, TextBlock 등) UserWidget 사용자가 위젯 블루프린트로 UI를 편집하기 위한 클래스 UserWidget을 상속받은 클래스로 위젯 블루프린트 생성 Widget은 한 틱에 두 번씩 돌아감 1. Prepass 틱에서 자신의 DesiredSize 계산 2. OnPaint()에서 자식들..
1. 스택 프레임의 정의 스택 프레임(Stack Frame)이란 함수가 호출될 때, 그 함수만의 스택 영역을 구분하기 위하여 생성되는 공간이다. 이 공간에는 함수와 관계되는 지역 번수, 매개변수,복귀주소가 저장되며, 함수 호출 시 할당되며, 함수가 종료되면서 소멸한다. 이 영역을 표현하기 위해 함수 프롤로그(Prolog)와 함수 에필로그(Epilog)라는 것을 수행한다. (스택 프레임이란 ESP(스택 포인터)가 아닌 EBP(베이스 포인터) 레지스터를 사용하여 스택 내의 로컬 변수, 파라미터, 복귀 주소에 접근하는 기법이다.) ESP(스택 포인터): 스택이 현재 어디에 있는지를 가리키는 역할을 하는 레지스터다. (변화함) EBP: 스택프레임의 시작을 알리는 포인터다. 사실상 스택의 최하단(?).. 을 가리..
https://choi-dan-di.github.io/unreal/optimization-profiling/ [Unreal Engine] 언리얼 엔진 최적화 - 1. 프로파일링 언리얼 엔진의 최적화 방법에 대해 알아보기 choi-dan-di.github.io
Stack : 프로세스의 Stack 메모리 영역 지역변수와 매개변수 데이터 값이 저장되는 공간이며, 메소드 호출시 메모리에 할당되고 종료되면 메모리가 해제되며, LIFO(Last In First Out)구조를 가진다. Queue - OS의 스케쥴러 자원의 할당과 회수를 하는 스케쥴러 역할을 큐가 할 수 있다. 메모리에 적재된 다수의 프로세스 중 어떤 프로세스에게 자원을 할당할 것인가 그 순서를 결정하는 것이 자원의 효율적인 사용에 있고, 가장 단순한 형태의 스케쥴링 정책이 선입선처리(First Com First Served) 즉, 큐라고 볼 수 있다.
1. 해시(Hash) 자료구조란? 3명의 사람 (김연아, 손흥민, 서장훈) 이 위와 같이 부탁을 했다. 어떻게 기능을 구현해야 가장 효율적이고, 빠른 자료구조가 될까? 답은, 각각의 이름(텍스트)에 대해서, 유일한 Key 값을 가지게 하는 것이다. 만들어진 Key 값을 이용해서 자료에 접근한다면 O(1) 시간만에 접근할 수 있다. 2. 해시(Hash)의 동작원리 해시에서 Key를 생성하기 위한 다양한 알고리즘이 존재한다. MD-5나 SHA이 그 유명한 해시 알고리즘 중 하나이다. 'apple' 이라는 문자열이 주어졌다고 가정해본다. 우리는 Key를 만들기 위해서, 특정한 소수인 '5381' 을 이용해본다. Key는 최대한 중첩되지않고, 고르게 만드는 것이 좋다고 알려져있다. 그렇게 만들기 위해서 아래와 ..
Subsystem 활용한 언리얼 스타일 싱글톤 Singleton 패턴은 많은 짐이 있지만 무시할수 없는 기능성이 있다. 다행히도 Unreal Engine은 결점이 적은 방식으로 Singleton의 이점을 제공할 수 있는 방법이 있다. 나쁜 방식: C++ Static Singleton C++ static class singleton의 장단점 (장점) 프로그래머들이 즐겨사용하는 인터페이스 (단점) 잘못된 에디터와 상호작용 작업이 없다면, 에디터에서 게임이 여러번 실행되는 동안의 인스턴스들이 보존된다. Class Default Object(CDO)와 잘못된 상호작용 작업이 없다면, CDO가 생성될때 인스턴스가 생성된다. 라이프타임이 불분명 주의 깊은 프로그래밍과 라이프타임 관리를 위해 분명한 의도가 필요하다...
리스트와 벡터, 어떤게 더 빠를까? 벡터는 연속된 메모리 주소를 가진 Dynamic Array형태의 자료구조이다. 리스트는 힙공간에 값을가진 노드가 생성되어있고, 노드가 다음 인덱스의 또 다른 노드를 가르키는 구조이다. 단편적인 생각으로서는, 리스트와 벡터의 속도 차이에서 가장 큰 차이점은 중간 인덱스에 접근해서 삽입, 삭제를 할때 구조적으로 속도 차이가 날수밖에 없다고 생각하는데, 그렇다면 만약에 리스트와 벡터 둘다 순차적으로 접근할때 어느 자료구조가 더 접근이 빠를까? 배열이나 벡터처럼 연속된 공간으로 구성된 자료구조는 캐시상에서 연속된 공간에 존재하며, 캐시 공간을 차지하는 개수가 적기 때문에 포인터로 연결된 자료구조보다 접근속도가 빠르다. 포인터로 연결된 레코드로 구성된 자료구조(리스트나 트리)는..
FTimerHandle 타입의 변수를 헤더에 먼저 선언하여 전역 변수로 사용한다. GetWorldTimerManager().SetTime 함수를 호출하여, '헤더에 선언한 Timer를 통해 delay 시간 후에 Function 함수를 호출한다.' 라고 정의해주면 된다. 함수를 등록하는건 역시 바인딩을 통해 등록하면 된다. 하지만 코루틴은 시작과 동시에 등록하면, 코루틴 함수에 있는 무한 루프문을 통하여 지속적으로 함수가 호출되지만, 방금 설명한 API는 지속적으로 호출하고 싶다면, 호출된 함수 내에 다시 SetTime 함수를 호출해야 한다. 따지고 보면 코루틴 보다는 '일정 시간 후에 한번만 호출해라.' 는 쪽에 가깝다. 그리고 등록한 함수를 해제하고 싶다면, ClearTimer를 통하여 함수를 등록한 ..
TEXT 매크로 TEXT("Hello World"); 언리얼에서는 문자열 리터럴을 TEXT 매크로 안에 넣어서 TEXT("Hello World") 이런식으로 넘기는게 좋다. - 어떤 플랫폼에서든 동작할 수 있도록 언리얼이 인코딩을 해주기 때문이다. 모든 플랫폼에서 2 바이트 문자열로 동작하게끔 해준다. FString C++ 에서의 string처럼 문자열 처리와 관련된 메서드들 사용 가능 FString str = TEXT("Hello World"); printf 함수 FString::printf(TEXT("Actor Name: %s, ID : %d, Location X : %.3f", *GetName(), ID, GetActorLocation().X); C언어의 printf와 비슷하다. 형식 문자열을 출력..
만약 위와 같은 화면을 위해 레이아웃을 구성해야 된다면? 방법은 여러가지가 있겠다.. xml에 하나하나 그려가며 잡아줄 수도 있고, 코드로 동적으로 원하는 만큼의 레이아웃을 만들어 붙일 수도 있고. 등등.. 사실 정답은 없다. 하지만 위의 방법들은 리스트의 아이템이 많아질수록 xml이 굉장히 복잡해지거나 길어져 보기에도 불편하고 유지보수에도 힘들것 같고, 한번에 화면에 모두 그려야하기에 안드로이드가 부담스러워 할 것 같다. ListView를 사용한다면 좀 더 간단하게, 좀 더 부담이 덜 되도록 알아서 관리를 받을 수 있다. ListView란? ListView란 무엇일까요? ListView는 말 그대로 View들을 리스트처럼 보여주도록 하는 컨테이너 이다. '컨테이너'라 함은 흔히 알고 계시는 선박에서 물..