공부 41

Prefix Sum 알고리즘

https://app.codility.com/programmers/lessons/5-prefix_sums/ n 개의 숫자가 있고, m 개의 쿼리에 각 쿼리마다 a 인덱스부터 b 인덱스까지의 숫자의 합을 구하는 문제 숫자들의 합산을 저장하는 배열을 선언하고 n 개의 숫자 배열을 순회하며 합산을 저장한다. a 부터 b 까지의 숫자들의 합은 합산 배열의 b 인덱스 에서 a - 1 인덱스 값을 뺀 결과값이다. prefix sum 알고리즘을 이용하면 m * n 의 시간 복잡도를 m + n 으로 줄여준다.

공부/Algorithm 2023.05.06

Max Slice 알고리즘

https://codility.com/media/train/7-MaxSlice.pdf Prefix Sum 을 이용하는 방법은 O(n^2) 의 시간 복잡도가 걸린다. O(n) 의 시간 복잡도가 걸리는 다른 방식이 있다. 9.3. Solution with O(n) time complexity This problem can be solved even faster. For each position, we compute the largest sum that ends in that position. If we assume that the maximum sum of a slice ending in position i equals max_ending, then the maximum slice ending in posi..

공부/Algorithm 2023.05.06

정수의 합이 오버 플로우 났을 때

정수의 합이 오버 플로우가 났을 때 더하는 정수들을 더 큰 자료형으로 캐스팅 한 후에 더한다. 더한 값을 동일하게 큰 자료형에 저장하면 오버 플로우가 나지 않고 정상적인 합을 구할 수 있다. int32_t num1 = INT32_MAX; int32_t num2 = INT32_MAX; // num1 + num2 의 값은 오버플로우가 나서 sum 은 -2 이다. int32_t sum = num1 + num2; // num1 + num2 의 값은 이미 오버플로우가 났기 때문에 int64에 저장해도 sum 은 -2 이다. int64_t sum = num1 + num2; // num1 과 num2 를 int64_t 형으로 캐스팅하면 오버플로우가 나지 않고 정상적인 값이 나온다. int64_t sum = (int6..

공부/C++ \C# 2023.05.03

렌더링 파이프라인

참고 https://woo-dev.tistory.com/168 https://rito15.github.io/posts/rendering-pipeline/ 렌더링 파이프라인 이미지 입력 조립기 - 버텍스 정보를 받아와 정점을 연결해 삼각형 모양 같은 프리미티브(표현 가능한 가장 작은 단위)들을 만든다. 정점 쉐이더 - 정점 데이터를 받아 공간 변환을 한다. MVP(Model, View, Projection) 변환을 한다. Model 변환은 Local -> World 스페이스로 변한다 로컬 스페이스는 각 오브젝트마다 자신만의 원점을 가지는 공간입니다. 월드 스페이스는 하나의 원점을 가지는 공간입니다. 각 오브젝트 좌표 공간을 변환하여 하나의 월드 공간으로 통합하는걸 Model 변환이라고 합니다. View 변..

공부/Rendering 2023.04.28

AOS, IOS 어플의 설치 경로에서 파일 읽어오기

윈도우에선 FFileHelper::LoadFileToString 으로 파일의 스트링을 읽어올 수 있지만 안드로이드나 iOS 에서 파일을 읽으려면 특수한 함수를 이용해야 한다. 안드로이나 iOS 에선 설치된 어플의 경로에서 파일을 가져와야 한다. 안드로이드의 경우 AAssetManager 를 이용해서 앱의 리소스들이 들어있는 assets 폴더의 경로를 가져와야 하고 iOS 의 경우엔 [NSBundle mainBundle] 를 이용해서 어플의 경로인 '어플 이름.app' 의 경로를 가져와야 한다. 플랫폼에 맞게 리소스가 있는 폴더 경로를 가져올 수 있는 함수가 FGenericPlatformMisc::LoadTextFileFromPlatformPackage 함수이다. 각 플랫폼에 맞게 override 해서 사..

Build.cs, Target.cs, .uproject, .uplugin 의 사용성

build.cs 각 모듈에는 각자만의 build.cs가 있다. build.cs 는 컴파일 타임에 로드되고 처리되는 전처리기 같은 거라고 한다. (런타임에서는 로드 안 됨) build.cs 에서 해당 모듈에서 참조할 다른 모듈 목록을 지정할 수 있는 등 다양한 옵션을 제공하고 있다. 아래는 build.cs 에서 지정해줄 수 있는 유용한 기능들을 정리해보았다. RuntimeDependencies 사용 예시는 아래와 같다. RuntimeDependencies.Add("$(TargetOutputDir)/cjson.dll", Path.Combine(ModuleDirectory, DllCjsonPath + "cjson.dll"), StagedFileType.SystemNonUFS); 패키징할 때 특정 경로에 특정 ..

UE4 모듈에 관해서

UE4에선 모듈이라고 라이브러리를 한 프로젝트 내에서 여러 개 생성할 수 있게 해줌. 모듈은 스태틱 라이브러리로도, DLL로도 생성이 가능하다. Modular 모드 DLL 같은 개념 Monolithic 모드 스태틱 라이브러리 같은 개념 UE4 엔진 모듈 타입 Developement 개발 도중에만 사용하는 모듈 Editor 에디터에서만 사용하는 모듈 Runtime 언제든, 어디에서든 사용 가능한 모듈 ThirdParty 써드 파티(에픽 게임즈가 코드 작성 안 한) 라이브러리(모듈), 코드 모듈과 플러그인 차이 플러그인은 모듈을 여러 개 가질 수도 있고, 리소스도 따로 가질 수 있음. 즉 모듈은 코드만 있는데 플러그인은 코드랑 리소스 둘 다 가질 수 있다. 플러그인의 모든 코드는 모듈에 포함되야 됨. UCL..

언리얼 엔진에서 dll의 사용성

ThirdParty dll을 패키징 빌드에서 사용할 때와 에디터 빌드에서 사용할 때 경로가 다르다. 패키징 빌드에서는 패키징 할 때에 dll 이 포함되도록 작업해야 한다. 패키징 빌드에서 이용하는 dll 들은 build.cs 에서 패키징 빌드의 특정 경로에 복사할 수 있도록 작성 할 수 있다. (https://haewoneee.tistory.com/101 에서 RuntimeDependencies 부분 참조) 에디터 빌드 중 참조하는 dll 들은 Binaries/(PlatformType) 의 경로에 포함해줘야 한다. 일반 모듈의 경우는 (ProjectName)/Binaries/(PlatformType) 에 포함해주면 되고, 플러그인의 경우는 각 플러그인 폴더 내에 Binaries 폴더가 있으므로 (Proj..

Build.cs에서 모듈의 private 폴더 경로 추가

참조하는 모듈의 헤더 파일이 private 폴더에 있다면 build.cs의 PublicDependencyModuleNames나 PrivateDependencyModuleNames에 모듈을 참조하겠다고 선언해도 헤더 파일 인클루드가 안 된다. 위처럼 모듈을 참조하겠다고 선언해도 #include로 헤더가 인클루드 안 된다. 하지만 방법이 있다. 헤더를 인클루드 하기 위해선 모듈의 private 폴더 경로를 추가해줘야 한다. 위에 처럼 참조하는 모듈의 Private 폴더 경로를 PublicIncludePath, 혹은 PrivateIncludePath 에 추가를 해주면 헤더 인클루드가 잘 된다. PublicIncludePath 와 PrivateIncludePath 의 기능적인 차이는 없는 걸로 보인다. 하지만 ..

World Composition Level Streaming Problem when Teleporting

월드 컴포지션 레벨 스트리밍 문제 [문제점] 텔레포트 시 레벨들이 완전히 스트리밍이 완료되기 전에 캐릭터가 생성된다. 아직 스트리밍 되지 않은 레벨에 캐릭터가 떨어지게 되면 아무 것도 없는 공중에서 계속 낙하한다. [해결 방법] 월드 컴포지션이 스트리밍 레벨들을 스트리밍 하는 방식을 이해하고 스트리밍 레벨들이 로드가 완료된 시점을 알 수 있는 방법을 찾는다. 로드가 완료된 시점부터 캐릭터를 조작할 수 있게 할 방법을 찾는다. 레벨 로딩 방식 분석 [월드, 월드 컴포지션, 스트리밍 레벨, 레벨 간의 관계] 월드는 월드 컴포지션과 레벨 배열을 갖고 있다. 월드 컴포지션은 스트리밍 레벨 배열을 갖고 있다. 스트리밍 레벨은 로드된 레벨을 갖고 있다. [월드 컴포지션의 레벨 스트리밍 방식] 월드 컴포지션은 Pla..