목록Game Engine (23)
Visual Studio
Android로 배포한 언리얼 앱을 Unreal Insights로 분석하는 방법은 두가지가 있다.1. "-tracefile=[파일이름]" 명령 인수로 디바이스 저장소에 .utrace 파일 생성 후 PC로 복사하여 분석하기2. "-tracehost=127.0.0.1" 로 Unreal Insights와 직접 연결하여 분석하기 일단 1번과 2번 모두 adb push를 사용하기 때문에 USB 디버깅이 켜져 있어야 하고, 갤럭시 기준으로 개발자 메뉴에 있는 "OEM 잠금 해제"를 켜줘야 한다. (몇년전에 커스텀롬을 하기 위해 recovery mode로 진입하여 XDA에서 만든 부트로더 잠금 해제 툴로 벽돌을 감수하고 잠금 해제를 했었는데, 이제는 개발자 메뉴에서 딸깍이 가능한 것이 신기했다.) adb는 Andro..
https://www.youtube.com/watch?v=uykuLOgfcok&t=900s 유용한 영상이 있어 기록한다. 절반 정도의 분량만 시청했는데 언리얼의 메시 렌더링 파이프라인을 이해하는데 큰 도움이 되었다.요약하자면 SceneProxy에서 같은 버텍스, 머티리얼을 사용하는 메시들의 묶음인 FMeshBatch를 생성하고,MeshPassProcessor에서는 AddMeshBatch 함수를 오버라이드해 FMeshBatch를 MeshDrawCommand로 변환한다.MeshDrawCommand는 Draw Call에 필요한 모든 정보를 가지고 있으며, 예시로 Shader Binding, Vertex Steam, Index Buffer, PSO 캐시 ID 등이 있다.
실제 게임 플레이시에는 BackBuffer에 직접 씬을 렌더링하지만,Unreal Editor에서 편집중인 월드를 뷰포트에 그릴 때는 BackBuffer에 그리지 않고 BufferedRT라는 텍스쳐를 렌더 타겟으로 하여 그린 후 Slate UI 그릴때 BufferedRT 텍스쳐를 가져와서 뷰포트에 그린다. RenderDoc에서 뜯어본 BufferedRT 텍스쳐
중요한 포인트는 "Relative"와 "Local"의 차이이다.Relative는 부모 Component의 트랜스폼에 기반한 좌표계를 의미하며,Local은 자기 자신의 트랜스폼에 기반한 좌표계를 의미한다.따라서 "AddRelativeLocation" 함수는 부모 트랜스폼의 좌표계에서 주어진 벡터만큼 이동하는 것이고,"AddLocalOffset" 함수는 자기 자신의 좌표계에서 주어진 벡터만큼 이동하는 것을 의미한다.참고자료https://forums.unrealengine.com/t/difference-between-addlocaloffset-and-addrelativelocation-nodes/53731/3
FFrameNumberFFrameRateFFrameTime 혹시 사용할 일이 있을 수도 있으니 기억해두자.
아이디어- 폰트 관련 데이터 객체들(FCodepointFontCacheData, FFontData, FFreeTypeFaceGlyphData)을 가져올 때 유효한지 검사하는 로직이 오버헤드가 큼. - 정확히는 아래 두 함수 내부의 검사 로직이 오버헤드가 크다. - FSlateFontRenderer::GetFontDataForCodepoint() - FCompositeFontCache::GetFontFaceForCodepoint()- 유효함이 이미 검증된 폰트 데이터는 한번 더 캐싱함. (편의를 위해 2차 캐시라고 부르겠음)- 이후 같은 글자에 대해서 폰트 데이터가 필요할 경우 2차 캐시가 있다면 검사 과정을 스킵하고 가져옴. 구현영향을 미치는 범위를 줄이기 위해 Ascii code 범위의..
Unreal Engine 소스코드를 수정하여 에픽 게임즈의 저장소에 기여해 본 경험을 기록하기 위해 이 포스트를 작성하였다. PR 링크: https://github.com/EpicGames/UnrealEngine/pull/10894 작년 11월에 Editable Text에서 발생하는 버그를 수정해 Unreal Engine 저장소에 PR을 올린 적이 있다. 요약하자면 Editable Text에서 탭의 너비를 계산할 때 선행되는 탭 문자들을 고려하지 않아 너비가 제대로 계산되지 않는 문제를 해결한 것이었다. PR을 올리고 나서 한동안 소식이 없어 묻힌 줄만 알았으나, 한참 지나서 확인해보니 에픽 쪽 작업자가 변수명 등을 조금 수정해서 주석과 함께 메인 브랜치에 적용한 것을 확인할 수 있었다.남겨진 코멘트를 ..
FVector2D WindowSize(800.0f, 600.0); /* 원하는 값 대입 */if (FSlateApplication::IsInitialized()) /* 사실 검사 안해도 됨 */{ WindowSize *= FSlateApplication::Get().GetApplicationScale();} /* 윈도우 생성 코드 */... .MinWidth(WindowSize.X) .MinHeight(WindowSize.Y) .MaxWidth(WindowSize.X) .MaxHeight(WindowSize.Y)...
TMap의 키값으로 UObject 객체를 사용할 경우 Raw Pointer나 TObjectPtr 대신 TObjectKey를 사용할 수 있다.근데 공식 문서 어디에도 TMap의 키값으로 TObjectKey를 권장한다는 내용이 없는 걸 보니 무조건 써야 하는 것은 아닌 듯 하다. TObjectKey에는 FObjectKey 타입의 ObjectKey 멤버가 있는데, FObjectKey::ObjectIndex를 먼저 비교하고 동일할 시 FObjectKey::ObjectSerialNumber를 비교한다.어차피 64비트에서는 모든 연산이 64비트로 이뤄지므로 오히려 포인터보다 비교 연산자의 성능이 떨어질 것으로 예상된다.Type Hash를 구하는 과정에서도 포인터 타입은 UE::Private::MurmurFinali..