일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 언리얼
- 상속
- 반복자
- 티스토리챌린지
- exception
- reference
- resource management class
- effective stl
- 오블완
- more effective c++
- 참조자
- 루아
- virtual function
- operator new
- 영화
- 함수 객체
- lua
- UE4
- 게임
- 메타테이블
- 암시적 변환
- Effective c++
- 영화 리뷰
- 스마트 포인터
- 예외
- 다형성
- implicit conversion
- 비교 함수 객체
- c++
- Smart Pointer
- Today
- Total
목록개발 (181)
스토리텔링 개발자
개요 DynamicRHI 헤더에는 해상도 등 화면에 대한 정보를 알아오는 인터페이스들이 모여 있습니다. 플랫폼 별 타겟 RHI를 프로젝트 설정 내부에서 설정할 수 있습니다. 여기서 RHI는 어떤 의미일까요. RHI란 플랫폼 별로 그래픽 API가 다를 수 있습니다. (윈도우에서는 DirectX, 모바일에서는 OpenGL) 그리고 각 API 별로 기능과 사용 방법(인터페이스)이 다릅니다. 하나의 사용법으로 각 API를 모두 통제하려면 그 API 모두를 아우르는 상위 인터페이스가 필요합니다. 그걸 뜻하는 것이 바로 RHI입니다. RHI는 그래픽 API들을 래핑한 공용 C++ 인터페이스입니다. 피쳐 레벨 플랫폼 별 그래픽 API는 성능 등의 이유로 지원하는 수준이 다를 수 있습니다. 그래서 RHI는 그 수준에 ..
개요파생 데이터 캐시란 무엇일까요? 에디터에서 새로운 레벨을 열고 실행할 때마다 '파생 데이터 캐시를 생성한다'는 메시지가 뜨곤 하는 게 퍼뜩 생각나는데요.그렇다면 에셋을 사용하기 위해 쌓이는 일종의 캐시를 의미하는 것일까요? 파생 데이터와 파생 데이터 캐시(DDC)파생 데이터(Derived Data)는 에셋을 사용하기 위해 생성되는 부가적인 데이터들입니다. 사실, 언리얼 에셋 사용을 위해선 이 파생 데이터가 반드시 필요합니다.쉐이더의 경우를 예로 들어보겠습니다. 쉐이더의 경우 렌더링하려면 쉐이더 컴파일이 필요합니다.그 컴파일 과정 후에 나온 데이터들이 있을 텐데요.그게 바로 파생 데이터입니다. 파생 데이터는 그 크기가 큰데다가, 에셋 변화가 있을 시 언제든 새로 재생성될 수 있습니다.그래서 체크인 ..
개요 패키징 과정 중 쿠킹에 대해 알아보도록 하겠습니다. 쿠킹이란 에셋들은 엔진에서 사용하기 용이한 포멧으로 저장됩니다. 하지만 그 포멧이 실제 런타임 플랫폼에는 안 맞거나 지원을 하지 않을 수 있습니다. 즉, 플랫폼에서 지원하는 포멧으로 변환할 필요가 있으며, 그 과정을 쿠킹이라 합니다. 요약하면 쿠킹이랑 기존 형식을 각 플랫폼에 어울리는 형식으로 변환하는 과정을 말합니다. 쿠킹 과정 리소스를 엔진에 Import하면 uasset 확장자 파일로 변환됩니다. uasset은 내부에 실 데이터를 보관하고 있습니다. 즉 uasset은 실제 데이터를 패킹한 형태입니다. 쿠킹을 시작하면 엔진은 uasset의 내용물을 분석하여 플랫폼에 최적화된 데이터로 변환합니다. 쿠킹 경로 /Saved/Cooked/ 폴더 내에 저..
개요 간혹 언리얼을 새로 셋팅하고 난 후 디버깅이 다소 곤란해지는 경우가 있습니다. 브레이크 포인트를 통해서 FString의 값을 확인하지 못하는 현상인데요. 이를 해결하기 위해서 어떻게 해야 하는지에 대해 정리해 보겠습니다. 비주얼라이저 Visual Studio에는 비주얼라이저가 지원됩니다 디버거를 확장시켜 FName 및 동적 배열과 같은 일반적인 언리얼 타입들을 디버깅할 수 있게 해주는 기능입니다. 이를 Visual Studio에서 활용하기 위해선 설치가 필요합니다. 그 방법은 아래와 같습니다. /Engine/Extras/VisualStudio/Debugging/UE4.natvis의 파일을 복사합니다. 아래의 경로들 중 하나에 붙여넣기 합니다. [VisualStudioInstallPath]/Commo..
개요 벡터 반복자를 사용해서 순회 중 새 요소를 추가하는 순간 크래시가 발생했습니다. 컴파일러 특성에 따라 다를 수도 있겠지만, 컴파일러의 특성에 기반한 코드는 위험하니 이 용법은 문제가 있다고 봐도 무방합니다. 어떤 점이 문제였을까요. 문제 파악 이해를 돕기 위해 코드를 첨부합니다. vector test; test.push_back(1); test.push_back(1); test.push_back(1); for(auto it = test.begin() ; it != test.end() ; ++it) { test.push_back(1); } 마지막에 요소가 추가되었으므로 반복자는 문제 없이 계속 루프를 돌면 되지 않았을까요? 이 코드의 문제는 벡터가 일정 크기의 메모리를 미리 마련해둔다는 점입니다. 일..
개요 시간의 형식은 시스템에 따라 다양합니다. 각각 정리해 보았습니다. 타임스탬프 위키 백과에서는 유닉스 시간을 아래와 같이 정의합니다. 유닉스 시간(영어: Unix time)은 시각을 나타내는 방식이다. POSIX 시간이나 Epoch 시간이라고 부르기도 한다. 1970년 1월 1일 00:00:00 협정 세계시(UTC) 부터의 경과 시간을 초로 환산하여 정수로 나타낸 것이다. 즉, 타임스탬프에서 32비트 정수 0은 UTC 1970년 1월 1일 0시 0분 0초 을 의미합니다. 초(s) 단위이므로 32비트 정수 1은 UTC 1970년 1월 1일 0시 0분 1초를 뜻합니다. 단점 기준시각(1970년 1월 1일) 이전의 날짜/시간 값을 표현할 수 없습니다. 32비트를 넘어서는 2038년 1월 19일 이후의 날짜..
개요 언리얼 엔진에 있는 타입을 크게 나눠보면 아래와 같습니다. UObject를 위시하는 클래스 타입 구조체 타입 이 중 2번, 구조체에 대해서 정리해 보았습니다. 구조체의 선언 선언부는 UObject 기반 클래스와 같습니다. GENERATED_BODY() 매크로로 리플랙션 관련 함수들을 추가 생성자 선언 / 정의 USTRUCT() struct FTempStruct { GENERATED_BODY() public: FTempStruct() {} }; 구조체와 클래스의 차이 구조체를 사용하는 이유는 UObject 클래스가 구조체보다 무겁기 때문입니다. 구조체에서는 대표적으로 아래와 같은 기능들을 제공하지 않습니다. 가비지 컬렉팅 불가 구조체는 가비지 컬렉션의 관리를 받지 않습니다. 즉, 동적 할당을 한 경우..
개요 언리얼에서 레벨은 맵을 의미합니다. 엄밀하게는 맵과 맵 위의 모든 오브젝트들을 포괄하는 상위 오브젝트입니다. 어떤 오브젝트의 Outer 체인을 타고 올라가다 보면 반드시 그 끝에선 레벨 오브젝트를 만나게 된다는 뜻입니다. [UE4] 상위 객체 (Outer / Owner / AttachParent) 개요 이런 저런 객체들을 다루다 보면 의아할 때가 있습니다. 그러니까 객체들의 상위에 있는 객체가 분명한 네이밍인데 네이밍이 여러개일 때요. 저의 경우 Outer와 Owner가 굉장히 헷깔렸습니다. delightlane.tistory.com 다수의 레벨 구성 게임 전체의 맵과 오브젝트를 표현하기엔 단 하나의 레벨로는 무리입니다. 게임 내에 존재하는 그 수많은 오브젝트를 하나의 레벨에 담아 관리하는 건 부담..