전체 글 62

[Codility] Passing Cars

링크 : https://app.codility.com/programmers/lessons/5-prefix_sums/passing_cars/ 내 풀이 : 맨 처음 시도에는 이중 for문을 돌면서 검사했더니 시간 초과가 났다. 두 번째 시도는 1 을 가진 인덱스를 다른 배열에 저장해두고 0을 가진 인덱스와 비교하여 1을 가진 인덱스가 더 크면 (다른 배열의 크기 - 1을 가진 인덱스) 의 값을 최종 값에 더했다. 하지만 비교하는 다른 배열의 크기가 커서 그런지 시간 초과가 났다. 세 번째 시도는 0 을 가진 인덱스 배열을 추가로 선언해 불필요한 연산을 줄였다. 그리고 0의 인덱스와 1의 인덱스를 비교했을 때 1의 인덱스가 더 작으면, 1을 가진 인덱스 배열에서 해당 값을 지움으로써 비교 연산을 줄였다. 시간..

[Codility] PermMissingElem

문제 링크 : https://app.codility.com/programmers/lessons/3-time_complexity/perm_missing_elem/ 내 풀이 : 숫자가 있는지 없는지 판별하기 위해 다른 카운트 배열 하나를 선언하고, 배열을 순회하면서 숫자가 있으면 카운트를 올린다(인덱스가 숫자를 나타낸다). 다시 카운트 배열을 순회하면서 값이 0인 인덱스를 찾는다. 해당 인덱스에 들어있는 값이 0인 숫자가 배열에 없는 것이다. 인덱스가 숫자를 나타내므로 인덱스 숫자를 반환한다. 시간복잡도 는 O(2N) 이다. int solution(vector& A) { // Implement your solution here vector numCount(A.size() + 2, 0); for (auto n..

[Codility] OddOccurrencesInArray

문제 링크 : https://app.codility.com/programmers/lessons/2-arrays/odd_occurrences_in_array/ 내 풀이 : 소팅한 뒤에 숫자의 갯수를 카운팅한다. 숫자가 달라질 때 카운팅 한 갯수가 홀수면은 짝이 없는 걸로 판별하고 해당 숫자를 반환한다. 배열의 끝까지 검색했다면 마지막 숫자가 짝이 없는 숫자이므로 마지막 숫자를 반환한다. int solution(vector& A) { // Implement your solution here sort(A.begin(), A.end()); if (A.size() == 1) { return A[0]; } int count = 0; int unpairedNum = 0; int prevNum = 0; for (aut..

렌더링 파이프라인

참고 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..