2012-07-18 2 views
1

Java에서 새 엔티티 시스템을 구축 중입니다. 나는 제안 된 방법으로 인해 아키텍처에 현명하거나 성능에 문제가 있는지 궁금하다.엔티티 : 조건부 + 구성 요소 대 O (1) 전략의 해시 조회

내가 원하는 : 바람직하지 않은 대안 대

... 

for (Entity entity : entities) 
{ 
    for (Entry<String, Component> entry : entity.components.entrySet()) //collection is a Map 
    { 
     Component component = entry.getValue(); 
     component.update(deltaTime); 
    } 
} 

... 

:

... 


for (Entity entity : entities) 
{ 
    if (entity.componentA != null) 
     entity.componentA.update(deltaTime); 

    if (entity.componentB != null) 
     entity.componentB.update(deltaTime); 

    //etc. for as many components as the entity has. Finite, but possibly many. 
} 

... 

첫 번째 방법으로, 나는 HashMap의 접근 방식에 관해서 생각했습니다 몇 가지 :

  • 필자는 불필요한 조건문을 피할 것이다 (수천 개의 엔티티가 update()을 호출 할 때 중요하지 않음).
  • 평균 읽기 액세스 시간은 O (1)이며 해시 충돌이 발생하지 않는 유일한 시간입니다.
  • HashMap.entrySet()은 for-each 구문을 사용하여 컬렉션을 반복 실행해야합니다. 문서에서 알 수 있듯이 "컬렉션 [집합]은지도에 의해 뒷받침됩니다." 그러나 이것은 HashMap이 내부적으로 집합을 생성하는지 알려주지 않고 매번 entrySet()이 호출 될 때 알려주지 않습니다.
+1

당신의 질문은 나에게 불분명 해 보입니다 : 당신은 HashMap을 언급하지만 코드에는 HashMap이 없습니다. 또한'update'는 컴포넌트에 적용 할 수 있지만 첫 번째 코드 스 니펫의 엔티티에서 호출합니다 ... – assylias

+0

@assylias Thanks! 둘 다 수정했습니다. –

답변

1

첫 번째 버전은 거의 확실 최고의 디자인 될 것입니다 :

  • 보다 일반적인 코드 것은 - 가능한 모든 구성 요소의 구성을
  • 더 간결 코드 및 유지 보수를 포함 - 모든 조건문을 피하기
  • 더 유연한 런타임시 - 동적으로 구성 요소 목록을 변경할 수 있습니다.
  • 패스트 - 구성 요소 당 O (1) 여야합니다. 엔티티 구성 요소가 올바른 반복자가있는 합리적인 데이터 구조라고 가정하면

실제 성능에 신경을 쓰고 에 이미이라는 프로필이있는 경우 매우 중요한 특수 사례입니다. 예를 들어 맞춤 데이터 구조를 작성하는 것이 좋습니다. ComponentList)를 입력합니다.모든 포함 된 구성 요소에 대한 업데이트 작업을 효율적으로 수행하기위한 추가 방법이있는 updateAll(deltaTime)이 있습니다. 이것은 몇 가지 장점이있다 : 당신은 당신은 구성 요소 유형에 전문으로 불필요한 주물을 피할 수

  • (당신의 HashMap 또는 ArrayList를 사용하는 경우 일 것이다) Iterator 객체의 할당을 피할 수

  • 2

    읽기 액세스 시간은 O (1) (당신이 그것을 얻을 가능성이있어 유일한 시간은 해시 충돌에) 평균;

    엔트리 세트의 각 루프에 대해 map.get()을 호출 할 필요가 없습니다.

    그러나 entrySet()이 호출 될 때마다 HashMap이 내부적으로 세트를 작성하는지 알 수 없습니다.

    아니요 매번 새로운 세트를 생성하지 않습니다.


    가장 깨끗하고 읽기 쉽고 유지 보수가 쉬운 코드를 작성해야합니다. 실적이 좋지 않은 경우 (즉, 애플리케이션을 프로파일 링하고 실적 문제가 코드의 일부로 인해 결정된 경우) 최적화를 시작하십시오.

    ==> 각 루프마다 a를 사용하십시오.