Unity DOTS/TIP

UNITY DOTS TIP - ComponentData를 세분화 해라

개양반 2022. 12. 1.
728x90

세분화된 EntityQuery를 작성하기 위해

1. 설명

Entity의 ComponentData에 바로 엑세스하는 것은 임의 접근이므로  비효율적으로 처리된다. 그래서 EntityQuery를 통해 구성 요소를 처리해야 한다. Query로 조회하는 ComponentData가 세분화되고 작을수록 CPU가 캐시를 훨씬 더 효율적으로 사용할 수 있다. CPU의 캐시 라인이 64비트에 불과하므로 필요한 ComponentData만 조회하도록 Data를 세분화 하는 것이 좋다.

 

캐시란? 데이터를 미리 복사해 놓는 임시 장소를 가리킨다. 

2. 예제 코드

public struct Character : IComponentData
{
	public int Healty;
	public int Power;
	public bool IsJomp;
	public int Speed;
}

MoveSystem을 만들 때 ComponentData를 세분화하지 않고 위의 코드대로 작성하면 EntityQuery를 세분화할 수 없다. 그래서 이동에 필요없는 Healty, Power등의 데이터도 함께 EntityQuery에 조회가 되므로 CPU에게 비효율적인 코드가 된다.

CPU의 일반적인 캐시 라인이 64바이트에 불과하므로 효과적으로 사용해야 한다는 점을 감안해야 한다.

 

3. 어떤 식으로 ComponentData를 세분화하면 좋을까?

ComponentData를 무작정 잘게 잘게 잘라놓으면 특정 System에서 사용하는 Data를 하나 하나 EntitiyQuery로 조회가 되도록 작성해야 하는건 또 다른 지옥을 경험하게 되고 어차피 EntityQuery로 조회되는 그룹은 함께 처리가 되므로 무식하게 세분화할 필요는 없다. 그럼, 어떤 기준을 세워서 ComponentData를 세분화하면 좋은 것 일까?

답은 Query에서 조회되는 Data끼리 하나의 ComponentData로 묶는 것이다. 그리고 IsJomp 점프 여부는 공격시스템, 이동시스템 등 여러 곳에서 사용할 수 있다. 이런 녀석은 하나의 ComponentData로 만들어주는 것이 좋다. 그래서 유니티는 DOTS로 개발하기 전에 각각의 Data들이 어디서 사용될 것인지 미리 엑셀에 정리하는 것이 좋다고 한다.

 

아래는 Data를 미리 정리한 문서 예제이다. [예제 링크]

댓글

💲 추천 글