클래스 멤버 선언 순환문제 #includeusing namespace std; class DataSecond;class DataFirst {private : DataSecond m_DataSecond;};class DataSecond{};1. 상황 class DataSecond는 Class DataFirst를 상속하는데, Class DataFirst가 다시 Class DataSecond 객체를 멤버로 가지고 있다. 2. 문제 Class DataSecond가 생기기도 전에 객체를 멤버를 가지면 Class DataFirst는 객체의 크기를 결정 할 수가 없다. (객체를 생성하려면 컴파일러는 해당 클래스의 정확한 크기(sizeof)를 알아야 한다.) 전방 선언만으로는 크기를 알 수 없기 때문에 오류가 난다..
상황에 따라 여러 UI를 변경해야 할 때, 어떻게 설계해야 할까?게임 클라이언트를 개발하다 보면 특정 상황에서 여러 UI의 상태를 한꺼번에 변경해야 할 때가 있다.예를 들어 A 서버로 이동한 뒤 B 상황이 시작되었다고 가정해 보자.B 상황에서는 다음과 같은 변경이 필요할 수 있다.인벤토리의 특정 아이템 슬롯 비활성화미니맵의 특정 버튼 숨김채팅 입력창 비활성화특정 체크박스의 체크 상태 변경프로그레스바 표시일부 아이콘 이미지 변경이때 B 상황을 관리하는 클래스가 UI를 어떤 방식으로 변경해야 할까?처음 생각해 볼 수 있는 방법은 크게 세 가지다.각 Dialog에 B 상황 전용 함수를 만든다.B 상황 클래스가 각 Dialog와 Control에 직접 접근한다.변경할 Control 정보를 목록으로 만들어 공통 처..
1. 상황계속해서 정보의 개수가 변하는 상황이 있다. (ex. 참가자 수, 모임 수 등) 정보의 개수만큼 유저의 정보를 받아서 사용해야 하는 상황이다. 동적할당이 좋을까? 배열 또는 벡터가 좋을까? 2. 추천 (ex. 참가자, 모임 수)처럼 달라진다면 std::vector로 실제 결과 수만큼 보관하는 방식을 추천한다. 2 - 1. 서버에서 준 정보를 그대로 사용할 때 (results가 원본 포인터 일 때,)※ assign은 이전에 있었던 원소가 있다면 모두 삭제하고, 인자로 받은 새로운 내용을 집어넣는다. void ServerDataAck(const SData* results, size_t count){ SDatas.assign(results, results + count);} 2-2. 하나씩 넣는..
std::sort(vec.begin(), vec.end(), [](const auto& a, const auto& b) { return a.Value() >= b.Value(); }); struct Compare{ bool operator()(const Item& left, const Item& right) const { return left.Value() >= right.Value(); }};sort(temp.begin(), temp.end(), Compare{}); 이 두 코드는 exception error를 뱉는다.위 두 코드의 문제점은 무엇일까? 1. _STL_VERIFY 에서 에러 분석Visual Studio의 MSVC STL내부에 있는..
1. 개요게임 세상 속에서는 아이템의 유효기간이나 유저 로그인 시간, 이펙트 발동 시간, 스킬 지속 시간 등 많은 시간들이 존재한다. 이러한 시간을 계산을 할 때 클라이언트(유저) 시간과 게임 안에서의 시간(서버시간) 등의 차이로 남은 시간을 계산한다. 이때 Windows 환경에서 흔히 사용하는 함수 중 하나가 GetTickCount() [ 컴퓨터 부팅 시간 ]이다.하지만 GetTickCount()는 최대 49.7일마다 반환값이 0으로 순환한다는 한계가 있다.과거에는 자주 컴퓨터를 껐다 켰지만 요즘에는 컴퓨터 화면만 절전해 두고 오래 컴을 키는 경우가 많아진다. 그럴 때 DWORD 자료형 리턴값을 가지고 있는 GetTickCount를 사용하면 시간 계산이 잘 못 될 수가 있다. 2. GetTickCou..
아주 오래된 Perforce를 쓰는 사람들(2012년 전 퍼포스)... workspace에 파일 받지 않아도 대용량 파일 지우는 방법 공유 일단 우리 회사 퍼포스는 아주 오래된 구석기시대의 퍼포스를 사용한다. 구석기라고 말하기도 그렇고... 빙하기 정도? 퍼포스 모든 커밋이 중앙서버(Depot)로 되어 있다. 퍼포스의 가장 큰 장점 중 하나가 빅데이터, 바이너리 파일들을 빠르게 처리할 수 있다. 때문에 큰 프로젝트를 하는 곳에서 리소스용으로 가지고 있는 경우가 많다. 해본 사람은 알겠지만 게임회사에서 게임 리소스는 아주아주 대용량이다. 받는데 얼마나 오래 걸리겠어 ~ 하지만 한 사람이 받으면 중앙서버를 사용하기 때문에 다른 사람의 접근이 아주 느려진다. 장난 빼고 모든 팀원이 받는다고 하면 하루 종일 걸..
concept의 requires템플릿 인자(Template parameter)에 특정 조건(제약 조건)을 걸 때 사용하는 문법입니다. 예를 들어 아래 코드는 T타입이 FInv_ItemFragment를 상속받은 타입이어야만 함수 사용이 가능하도록 제한합니다. template requires std::derived_from const T* GetFragmentOfTypeWithTag(const FGameplayTag& FragmentTag) const ;이렇게 requries의 특정 조건(제약조건)이 되는 derived_from은 C++20에 추가된 concept입니다. derived_fromConcept란 "이 타입이 특정 조건을 만족하는가?"를 컴파일 타임에 검사하는 기능입니다. 그래서 concept 정..
프로그래밍 용어인 델리게이트는 넓은 의미로 본다면 특정 객체가 해야 할 로직을 다른 객체가 대신 처리할 수 있도록 만드는 보편적인 설계의 개념으로 의미한다.언리얼 엔진의 델리게이트는 A객체가 B객체에 작업 명령을 내릴 때 B 객체에 자신을 등록하고 B의 작업이 끝나면 이때 A에게 알려주는 방식을 의미한다 .A가 B가 요구하는 형식으로 멤버 함수를 만들면 이를 B에 등록할 수 있고, B가 특정 상황이 될 때 B는 미리 등록해둔 A의 멤버 함수를 호출해주는 방식으로 동작한다. 매크로 (MACRO)Blueprint바인딩 개수반환값특징DECLARE_DELEGATE❌1개 ⭕가장 빠름DECLARE_MULTICAST_DELEGATE❌여러 개 ❌호출 순서 보장 안됨.DECLARE_DYNAMIC_DELEGATE⭕1개 ..
📒 1. TObjectPtr (UE5) " 이미 만들어진 객체를 가리키는 UObject 포인터 "UE5 : TObjectPtr Item;UE4 : UInv_InventoryItem* Item; 이미 생성된 UObject를 가리키는 포인터 UE5에서 권장하는 UObject 포인터사용법은 UObject*와 거의 동일하다.GC가 객체를 추적하기 쉽다.에디터에서 참조 관리가 향상된다.지역 변수나 함수 인자는 Raw Pointer(UE4 버전)를 많이 쓴다. 📒 2. TSubclassOf " 앞으로 만들 클래스 " TSubclassOf WeaponClass;특정 클래스의 자식 클래스만 담을 수 있는 클래스 타입실제 객체가 아니라 클래스(설계도)를 저장한다SpawnActor(), NewObject() 에서 많..
공간을 일 그러 뜨리는 능력이 있던 개찐따 안경 30년 만에 벗어내다. ✅ 서울|부산 밝은 세상안과를 선택한 이유압도적인 수술경험압도적인 리뷰 수 (네이버 리뷰 1만 건 넘고, 구글 리뷰도 5000건이 넘는다. 압도적이다..)GPT가 추천해 준 병원 중 하나오래된 병원 (나랑 한 살 밖에 차이 안남..!)전문의 의사 많음 장비 많음 병원 아주 큼회사에서 제휴업체 안과가 있어 한 100만 원 정도는 싸게 수술할 수 있지만 굳이...? 제휴업체의 의사 선생님을 모르지만, 동네 병원에서 수술은 뭔가 무섭다.. 수술경험이 많은 병원에서 하는게 더 안심된다. https://www.iloveeye.com/index.do?utm_source=naver_pc&utm_medium=bs_seoul&utm_camp..
Enhanced Input 키 리맵 UI 구현 흐름 정리이번 글에서는 키 변경 UI가 실제로 어떤 흐름으로 동작하는지 정리해보겠습니다.예시는 UWidget_ListEntry_KeyRemap, UWidget_KeyRemapScreen, 그리고 IInputProcessor를 사용한 구조입니다.전체 흐름은 아래처럼 보면 이해하기 쉽습니다.리스트 엔트리에서 변경 / 리셋 버튼 클릭키 입력을 받을 전용 화면 표시화면 활성화 시 Input Preprocessor 등록사용자 입력을 먼저 감지유효한 입력이면 실제 키 매핑 변경설정 저장 후 화면 종료비활성화 시점에 Input Preprocessor 해제즉, 단순히 버튼을 눌러 키를 바꾸는 구조가 아니라 입력을 기다리는 전용 화면을 띄우고, 그 안에서 입력을 먼저 받아 ..
비주얼 스튜디오의 런타임 형식 정보 사용은 C++의 RTTI(Run-Time-TypeInformation)의 옵션입니다. 이 옵션은 보통 dynamic_cast나 typeid, std::type_info를 쓸 때 필요합니다.예(/GR): 실행 중에 “이 객체의 실제 타입이 뭐지?”를 확인할 수 있음dynamic_cast, typeid, std::type_info 기반 동작 사용 가능다형성 기반 코드, 상속 구조, 플러그인/프레임워크 코드에 안전타입 정보가 추가돼서 .rdata 섹션 크기가 늘어난다.(약간)아니요(/GR-): 그런 타입 정보 생성을 끔런타임 타입 판별 기능을 사실상 못 쓴다고 보면 됨성능·용량을 조금 더 아끼고 싶은 프로젝트에서, RTTI를 전혀 안 쓴다는 확신이 있을 때만 고려dynami..