그냥 게임개발자

FName 본문

Unreal스터디/FName

FName

sudoju 2024. 1. 1. 15:37

FName의 활용

 

언리얼이 제공하는 다양한 문자열 처리

  • FName : 에셋 관리를 위해 사용되는 문자열 체계.
    • 대소문자 구분 없음.(FString으로 변환 할 수 있지만 대소문자를 구분하지 않기에 데이터가 깨짐)
    • 한번 선언되면 바꿀 수 없음.(int로 변환됨)
    • 가볍고 빠름.
    • 문자를 표현하는 용도가 아닌 에셋 키를 지정하는 용도로 사용. 빌드시 해시값으로 변환됨
  • FText : 다국어 지원을 위한 문자열 관리 체계
    • 일종의 키로 작용함
    • 별도의 문자열 테이블 정보가 추가로 요구됨
    • 게임 빌드 시 자동으로 다양한 국가별 언어로 변환됨
 

FName 클래스

https://docs.unrealengine.com/5.3/ko/fname-in-unreal-engine/

 

FName

  • 다이내믹 머티리얼 인스턴스의 파라미터 변경, 스켈레탈 메시에서 본 접근은 모두 FName을 사용
  • 초경량 시스템을 제공
  • 해시 테이블을 사용해서 빠르다.
  • 찾기위한 용도, 문자열을 처리하기 위한 클래스는 아님
  • 대소문자 구분 하지 않음, 소유 스트링 테이블에 대한 인덱스와 인스턴스 번호의 조합으로 저장

FName의 구조와 활용

  • 언리얼은 FName과 관련된 글로벌 Pool 자료구조를 가지고 있음
  • FName과 글로벌 Pool
    • 문자열이 들어오면 해시 값을 추출해 키를 생성해 FName에서 보관
    • FName 값에 저장된 값을 사용해 전역 Pool에서 원하는 자료를 검색해 반환
    • 문자 정보는 대소문자를 구분하지 않고 저장함 (Igonre Case)
  • FName의 형성
    • 생성자에 문자열 정보를 넣으면 풀을 조사해 적당한 키로 변환하는 작업이 수반됨.
    • Find or Add

FNamePool(글로벌 Pool)

FNamePool은 싱글톤으로 구성되어 있으며 글로벌의 네임들만 모아놓은 자료를 가지고 있음.

Key와 Value값으로 되어있는데 Key에는 FName의 Key값(해시값)이 저장이 되고 Key값을 이용해 FNamePool에 있는지 없는지 빠르게 검출된 그 값을 사용해 원하는 데이터를 가져오는 형태로 구성되어 있음

그래서 FName이라는 것은 실제적인 자료는 키 값만 들어가 있기에 용량은 작으며 Pool에 데이터를 찾거나 없으면 추가하는 행동밖에 할 수 없음

이러한 방식은 어떤 에셋들을 보관하는데 굉장히 유용하게 사용 가능

 

FName사용

 

대소문자 구분 확인

	FName Key1(TEXT("PELVIS"));
	FName Key2(TEXT("pelvis"));

	UE_LOG(LogTemp, Log, TEXT("FName 비교 결과 : %s"), Key1 == Key2 ? TEXT("같음") : TEXT("다름"));

 

주의할점

	for (int i = 0; i < 10000; i++)
	{
		FName SearchInNamePool = FName(TEXT("pelivs"));
		const static FName StaticOnlyOnce = FName(TEXT("pelivs"));
	}

이와 같이 쓰게 되면 위에 그냥 FName과 불변적인 cosnt static으로 정의 한 FName이 있는데 이런식으로 하게 되면 생성자에 문자열을 넣으면 FName이 하는 일은 문자열을 키로 변환한 다음 그 키가 FNamePool에 있는지 조사하는 작업을 거치게 됨

그런 작업들을 거쳐야 하기 때문에 데이터를 구성하는 데 있어 빈번한 작업이 일어날 때 오버헤드가 발생할 수 있음

결과적으로 FName에 관련 키 값만 저장이 되면 된다.

그래서 그 전에 한 번 선언해주거나 아니면 const로 FName의 Static으로 한 번만 처리하도록 하면 초기화할 때 데이터 저장하고 Static으로 선언했으니 그 다음부터는 이것을 찾을 일이 없다.

이것을 그냥 활용하면 되기 때문이다.

이게 더 효과적이다.

나중에 게임 제작할 때 이 FName을 자주 실행되는 Tick 같은 곳에서는 다소간의 오버헤드가 발생할 수 있다.