게임 엔진에서 자산을 식별합니까?


12

로드 된 자산을 식별하고 싶지만 어떤 자산을 선택해야하는지 모르겠습니다. 두 가지 옵션이 있습니다 :

  • 이름 (문자열)

    • 이것은 unorder_map (O (1))에서 가장 쉽고 빠르지 만 정수를 사용하는 것보다 느립니다.
    • 코드에서 쉽게 이해할 수 있습니다.
  • 정수

    • 가장 빠릅니다.
    • 코드에서 이해할 수 없습니다.

나는 문자열이 그렇게 안전하거나 빠르지 않다는 것을 알고 있지만 그렇게 나쁘거나 AAA 제목에서만 나쁘게 계산됩니까? 열거 형을 만들고 정수를 사용할 수는 있지만 런타임에 파일에서 장면, 자산 등을로드하면 열거 형을 사용할 수 없습니다. 런타임에 생성 된 정수를 읽을 수있는 방법이 있습니까?

이 문제는 인터넷 전체에 몇 가지 스레드가 있음을 알고 있지만 이것이 어떤 경우에 얼마나 중요한지 알 수 없었습니다.


10
왜 둘 다 구현하지 않습니까? 문자열 버전은 Dictionary <string, int>에 연결되어 Dictionary <int, Asset>을 호출합니다. 코드에서 문자열 기반 레이어를 피할 수 있지만 사용자 상호 작용에 문자열 기반 레이어를 사용하십시오.
Krythic

2
두 번째 @Krythic의 요점입니다. 코드에서 속도 정수를 좋아한다면 코드에서 정수를 사용하도록하십시오. 사용자가 가독성을 위해 문자열을 좋아하는 경우 사용자가 문자열을 사용하도록하십시오. 둘은 매우 공존 할 수있다 (그리고 릴리스에서 오버 헤드를 완전히 건너 뛰고 싶다면 문자열 버전을 개발 빌드로만 선택적으로 컴파일 할 수있다)
DMGregory

약간 다른 맥락에서 같은 문제 : 다른 아이템 구현 방법-차이점은 무엇입니까?
Philipp

답변:


19

둘 다 지원할 수 있습니다.

이 정수 또는 이와 유사한 빠른에-비교 키에 의해 참조 자산에 대한 런타임에 종종 더 효율적이지만 인간이 같은 이름 작업에서 훨씬 더 있기 때문에, 그것은 그들의 이름을 참조하는 디자인 타임에 종종 더 효율적입니다 enemy_bullet_casing_sound보다 72910613.

정수 키를 사용하여 자원을 직접 찾아보고 가능한 경우 코드에서이 정수를 사용하십시오 (정수의 실제 값을 변수에 넣을 수 있으므로 더 쉽게 작업 할 수 있습니다). 이름 에서 정수 키로 (자원이 아닌) 맵핑을 제공하고 자산에 대한 이름 지정된 참조가있을 때마다 해당 맵핑을 사용하여 실제 정수 키를 해결하고 자산을 찾으십시오.

이름 기반 조회를 사용하면 데이터 파일을보다 쉽게 ​​작업 할 수 있으며 이름을 더 빠른 키에 매핑하면 필요한 곳에서 더 빠르고 정수형 키의 모든 중요한 이점을 유지할 수 있습니다.


내 경우 : 객체의 재질을 변경하고 싶기 때문에 새 재질의 이름으로 요청을 보냅니다. (문자열) 그래픽 시스템에서 <문자열, 포인터> 정렬되지 않은 맵을 검색하면 객체의 재질 포인터가 새 포인터로 바뀝니다. 내 경우에는 정수로 변환 할 필요가 없습니까? (내가 그것을 포인터로 변환하고 자주 algorhytms에서 포인터를 사용하기 때문에 가끔씩 만 문자열을 사용한다.)
Tudvari

또는 가능한 모든 곳에서 포인터 대신 정수 ID를 사용해야합니까? (예를 들어 머티리얼의 헤더 파일을 포함 할 필요는 없습니다.) 예를 들어 렌더러 컴포넌트는 그래픽 엔진에서 직접 사용할 수있는 머티리얼의 포인터를 저장하지만 머티리얼을 포함해야합니다. . 그러나 렌더러 구성 요소에 정수 만 저장할 때 Material.h를 포함 할 필요는 없지만 포인터 배열에서 정수 기반 검색을 수행해야합니다. 나는 후자가 더 낫다고 생각합니다. 그렇습니까? 이것을 리팩터링해야합니까?
Tudvari

1

내 프로젝트에서는 컴파일 타임에 고유 한 숫자로 변환 된 해시 된 문자열을 사용합니다. 텍스처와 같은 리소스가 필요할 때 간단히

MngTexture->get(hash("my_texture"))

그리고 간단한 엔티티 시스템 프레임 워크를 만들고 파일에서 구성 요소 데이터를로드해야하기 때문에 데이터를 저장하기 위해 json과 같은 간단한 언어를 만들었지 만 컴파일 할 수는 있습니다 (단어에서 숫자로, 문자열에서 해시 값으로 단어 및 문자 변환) . 예를 들어, 데이터 파일에서 ID hash ( "my_texture")가있는 텍스처를 "ball.PNG"에 연결하려면

|my_texture| = "ball.PNG"

어디 || 내부에 단어를 해시하도록 컴파일러에 지시하는 연산자입니다.

따라서 기본적으로 실제 코드와 구성 요소를로드하는 스트림 인 파일 모두에서 컴파일 타임에 int에 매핑 된 문자열을 사용하므로 오버 헤드가 없습니다. 해시를 계산하기 위해 컴파일 시간은 단순히 구글에서 5-10 줄의 간단한 기능입니다.

물론 파일에서 문자열을로드하고 런타임에 해시 할 수 있습니다.이 경우 알고리즘이 자동으로 문자열을 생성하므로 문자열을 작성하지 않아도됩니다. 기억력이 있기 때문에 최소한지도에서 검색하는 것보다 속도가 빠르다고 생각하십시오 (몇 바이트 길이의 문자열을 반복하는 것입니다).

이것이 도움이되기를 바랍니다.


0

문자열로 객체를 식별하는 것이 최적이 아니며 int가 훨씬 효율적입니다. 편의를 위해 디자인 타임과 디버깅 중에 문자열 문자열 (또는 사전)을 정수로 유지 관리 할 수 ​​있습니다.

그러나 핵심 게임 코드 내에서는 정수 ID (또는 가독성을위한 열거 형)로만 객체를 참조한다고 주장합니다. 이렇게하면 문자열 테이블을 별도의 자산으로 분류하는 것이 더 간단 해집니다. 핵심 게임 코드가이 문자열 테이블에 의존하지 않는 경우 릴리스 된 게임에서 코드를 삭제하여 상당한 양의 메모리를 절약 할 수 있습니다. 모바일 게임에서 작업하고 다운로드 크기를 작게 유지하려는 경우 중요한 고려 사항 가능한.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.