엔터티 ID 시스템을 사용하면 어떤 이점이 있습니까?


12

저는 현재 Programming Game AI By Example을 읽고 있습니다.

이 책에서는 게임의 각 엔티티에 고유 ID 번호를 지정하는 것에 대해 언급합니다. 종종 엔티티 때 접촉 엔티티에 요구 B는 , A는 참조 얻는다 B 전송하여 B를 에의 ID 번호를 EntityDatabase의 클래스를. 이 클래스는 ID 번호를 받고 엔터티에 대한 참조를 반환합니다.

일부 엔티티의 ID 번호는 일부 엔티티 (주 게임 캐릭터)의 ID를 포함하는 파일에서 가져올 수도 있습니다.

내 질문은 : 왜 내가 이것을할까요? 참조를 직접 사용할 수없는 이유는 무엇입니까? 때로는 직접 참조하기가 어렵습니까? ID 시스템을 사용하는 것이 일반적인 접근법입니까? ID를 사용하지 않는 게임이 있습니까?

저는 게임 개발을 처음 사용합니다. 엔티티 ID 시스템 작업의 이점을 설명하십시오. 장점과 단점. 구체적인 예가 좋습니다. 감사

답변:


18

많은 상황에서 참조가 잘 작동합니다. 그러나 참조가 제대로 작동하지 않는 세 가지 중요한 상황이 있습니다.

  • 네트워킹 . 네트워크를 통해 엔티티 상태 동기화에 대한 정보를 보낼 때 참조를 사용할 수 없습니다. 원격 시스템이 내가 말하는 사람을 알 수 있도록 어떤 방식으로 엔티티를 식별해야합니다.
  • 저장 / 로딩 . 게임의 상태를 디스크에 저장하면 객체 참조와 함께 사용할 수 없습니다. 이는 상태를로드 할 때 참조에 의해 대상 B 엔티티가있는 엔티티 A가 더 이상 대상을 알 수 없음을 의미합니다. 메모리 위치가 다르고 개체가 다릅니다.

  • 메모리 관리 . 참조를 저장할 중앙 위치가 있다는 것은 엔티티를 삭제할 때 메모리를 정리하기 위해 모든 엔티티를 살펴보고 참조를 제거 할 필요가 없음을 의미합니다. 참조는 필요할 때만 사용해야하며 다른 엔터티에서는 제거해야합니다. 참조 횟수를 줄이면 마지막으로 상호 작용 한 것 또는 다른 엔티티 만 참조하는 좀비 엔티티가 없습니다. 또한 엔티티가 여전히 존재하는 경우 표준화 된 테스트 방법으로 널 참조를 피하는 데 도움이됩니다.


2
마지막 단락은 자체적으로 중요합니다 (메모리 관리). 한 클래스가 한동안 다른 개체에 대한 참조가 필요한 상황이 있지만 개체 참조가 유효하지 않을 수 있습니다 (예 : 발사체 대상 개체가 사망). ID로 엔터티를 요청할 때 NULL을 반환하면 각 클래스는 엔터티 참조가 유효하지 않을 때 충돌하지 않고 올바른 작업을 수행해야합니다.
LearnCocos2D

대답 해줘서 고마워. 명확히 할 질문. 일반적으로 : 엔터티 A가 엔터티 B에 대한 참조를 가져와야하는 상황에서 (공격하기 위해 메시지를 보내거나, 충돌을 확인하거나, 기타 다른 이유가 있음)-ID 시스템을 사용해야합니까? 그것을 얻거나 때로는 참조를 직접 얻는 것이 괜찮습니까? 의미 : 엔터티 A는 항상 엔터티 B의 ID (엔터티 참조 및 ID 번호를 상호 참조하는 ID)를 보내서 EntityManager에서 참조를 가져온 다음 EntityManager의 참조를 사용하여 엔터티 B에만 문의해야합니까? 항상 ID 시스템을 사용해야합니까?
아비브 콘

아니면 때로는 참조를 직접 얻는 것이 괜찮습니까? 다시 말해, 엔티티 A는 언제 EntityManager를 사용하여 내부에 저장된 참조를 가져와야하며 엔티티 A는 언제든 어떤 수단 으로든 B에 대한 참조를 가져올 수 있습니까?
Aviv Cohn

그것에 대한 정답은 없습니다. 개인적으로 저는 엔터티 시스템을 게임 로직과 독립적으로 디자인하려고합니다. 이는 게임 로직이 직접 엔티티 참조에 액세스 할 수 없다는 것을 의미합니다. 본질적으로 현재 방법의 로컬 범위를 넘어 엔티티에 대한 참조를 유지하지 않을 것입니다. 이는 엔터티의 구성 요소에서 작업하기 전에 매번 EntityManager를 사용하는 것을 의미합니다.
MichaelHouse

내가 참조. 당신이 무엇을 의미하는지 이해하기 위해 예를 사용하겠습니다. 충돌 감지를 위해 균일 한 그리드를 사용한다고 가정 해 봅시다. 그리드는 2D 배열입니다. 각 엔티티는 그리드에서 동일한 '셀'에있는 엔티티와 만 충돌하는지 확인합니다. "일반"접근 방식을 사용하면 각 셀은 해당 영역의 GameEntity 오브젝트에 대한 참조를 보유합니다. "ID 시스템"접근 방식을 사용하면 각 셀은 엔티티의 ID 번호를 보유합니다. 이러한 숫자는 충돌 감지를 위해 구체적인 참조를 받기 위해 EntityManager로 전송됩니다. 이것이 좋은 이해입니까?
Aviv Cohn

2

마지막으로, 오브젝트 풀 패턴을 사용 중이고 생물체가 죽어 (예를 들어) 다른 곳에서 다시 생성되어 엔티티가 재설정되는 경우 참조는 여전히 동일한 엔티티 (결함)를 가리키고 ID가 더 이상 유지되지 않습니다. 유효한.

ID 5067은 0x8765 생물체 주사위를 가리키고 다른 생물체는 새로운 생물체 ID를 7073으로 재설정 함을 가리킴 당신이 도달하려고 한 생물은 더 이상 활동하지 않습니다.

Byte56이 언급 한 훌륭한 이유는 참조를 직접 사용하지 않는 것이 좋은 디자인 인 이유입니다.

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