일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 영화
- 상속
- virtual function
- operator new
- UE4
- 다형성
- modern effective c++
- 함수 객체
- 반복자
- 티스토리챌린지
- 비교 함수 객체
- 예외
- 메타테이블
- 게임
- exception
- 암시적 변환
- c++
- 언리얼
- Effective c++
- 스마트 포인터
- implicit conversion
- resource management class
- more effective c++
- Smart Pointer
- 오블완
- effective stl
- reference
- 참조자
- lua
- 영화 리뷰
- Today
- Total
목록개발 (186)
스토리텔링 개발자
개요 간혹 언리얼을 새로 셋팅하고 난 후 디버깅이 다소 곤란해지는 경우가 있습니다. 브레이크 포인트를 통해서 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 클래스가 구조체보다 무겁기 때문입니다. 구조체에서는 대표적으로 아래와 같은 기능들을 제공하지 않습니다. 가비지 컬렉팅 불가 구조체는 가비지 컬렉션의 관리를 받지 않습니다. 즉, 동적 할당을 한 경우..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cSC8A1/btrhxqISVSH/0tSLGn9fzFbBACRZL5vxkK/img.jpg)
개요 언리얼에서 레벨은 맵을 의미합니다. 엄밀하게는 맵과 맵 위의 모든 오브젝트들을 포괄하는 상위 오브젝트입니다. 어떤 오브젝트의 Outer 체인을 타고 올라가다 보면 반드시 그 끝에선 레벨 오브젝트를 만나게 된다는 뜻입니다. [UE4] 상위 객체 (Outer / Owner / AttachParent) 개요 이런 저런 객체들을 다루다 보면 의아할 때가 있습니다. 그러니까 객체들의 상위에 있는 객체가 분명한 네이밍인데 네이밍이 여러개일 때요. 저의 경우 Outer와 Owner가 굉장히 헷깔렸습니다. delightlane.tistory.com 다수의 레벨 구성 게임 전체의 맵과 오브젝트를 표현하기엔 단 하나의 레벨로는 무리입니다. 게임 내에 존재하는 그 수많은 오브젝트를 하나의 레벨에 담아 관리하는 건 부담..
개요 언리얼에는 각기 여러 상위 객체들이 있습니다. 네이밍 만으론 헷깔리기 때문에 각각을 한번 구분해서 정리해 보았습니다. 각 상위 객체 Outer(UObjectBase) Outer는 굉장히 친숙합니다. NewObject 함수의 인자 이름입니다. 그리고 이는 오브젝트의 부모 객체를 의미합니다. 모든 오브젝트(UObject)는 관리를 위해서 트리 형태로 연결되어 있습니다. 패키지 - 월드 - 레벨 - 각 액터들 이렇게 이어두면 첫 번째로 순회가 편해집니다. 패키지 내의 모든 오브젝트를 순회하려면 차례 차례 타고 내려가기만 하면 되기 때문입니다. 직렬화, 즉 패키징 순회도 이 트리 구조를 순회합니다. [UE4] 직렬화 [UE4] 직렬화 직렬화 객체 직렬화란 객체를 바이트화 하여 메모리, 데이터베이스, 파일 ..
개요 메모리에 이슈가 있어 최적화가 필요할 때, 쉽게 떠올릴 수 있는 방법은 텍스쳐의 품질을 낮추는 것입니다. 하지만 무턱대고 저품질 텍스쳐를 사용하면 비주얼적으로 만족스럽지 않습니다. 상황에 따라서 고품질과 저품질을 취사선택할 수 있다면 좋을 것 같습니다. 그리고 밉맵의 역할이 바로 그것입니다. 텍스쳐 스트리밍 시스템 언리얼에서는 텍스처 스트리밍 시스템(스트리머)이 밉맵 기능을 제공합니다. 가용 메모리를 효율적으로 관리하면서 시각적인 퀄리티를 보장해줍니다. 좀 더 자세히 알아보도록 하겠습니다. 밉맵(Mipmap) 텍스쳐 스트리밍 시스템은 밉맵(혹은 Mips (밉))들로 텍스쳐 메모리를 관리합니다. 여기서 밉맵이란 무엇일까요. 밉맵이란 텍스처 해상도에 따라 미리 계산된 이미지 시퀀스들을 뜻합니다. 비유하..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/xxb3G/btrghQ2spjn/988o3OBRXKyyX7xmAg2NDk/img.jpg)
개요 게임에는 수많은 오브젝트들이 배치됩니다. 하지만 그 배치된 오브젝트들이 늘 그려질 필요는 없을 것입니다. 전혀 노출되지 않는 오브젝트까지 매번 계산하여 그리는 건 낭비이기 때문입니다. 이렇게, 필요 없는 상황에 렌더링을 하지 않게 하는 기법을 컬링이라고 합니다. 액터의 바운드 그려지지 않는 액터를 구분하기 위해서는, 우선 액터가 카메라의 시야에 있는지 없는지를 체크하기 위한 기준이 필요합니다. 액터는 컬링(가시성 테스트)을 위해 (박스형 + 구형)의 바운드 세트를 가지고 있습니다. 각각은 다음과 같습니다. 구형 바운드 간단한 거리 테스트에 사용합니다. 박스형 바운드 액터의 본 모양에 가까운 형태로 설정되어, 좀 더 정밀한 테스트에 사용합니다. 컬링의 종류 컬링이 필요한 상황은 각양각색입니다. 아래는..