Unity DOTS 2(이론 정리)

1 분 소요

ECS(Entity Component System)

  • CPU의 캐시 적중률을 높이는 새로 고안된 스크립팅 방법

    하나의 GameObject에 사용자가 컴퍼넌트를 여러개 붙이고 각 컴퍼넌트는 MonoBehavior를 상속받게 됨에 따라 Monobehavior자체(Behavior, Component, Unity.Object)만으로 갖고 있는 데이터와 함수도 많고 또한 각 컴퍼넌트는 메모리상에 이곳 저곳 퍼져있으므로 캐시 미스가 발생빈도가 매우 높다.

  • 따라서 데이터를 따로 모아 Array로 관리하여 캐시 적중률을 높이는 방식을 채택하게됨(Data Oriented Design)

    메모리에서 가져오는 것 보다 CPU 캐시에서 가져오는게 훨씬 빠르다는거

  • Unity.Mathematics가 지원하는 자료형은 SIMD연산도 가능하게 하여 속도가 빠르다고 한다.
  • 이를 보완함과 동시에 멀티코어, 멀티쓰레딩 프로그래밍도 사용자가 쉽게 할 수 있게끔 만들어줌.

Component?

  • 기존 Unity에서 GameObject에 C#으로 코딩한 컴퍼넌트에 데이터만을 모아놓은것 이라 이해하면 쉽다
public class TestObject : MonoBehavior
{
    public Vector3 pos;
    public Vector3 dir;
}

public struct TestEntity : IComponentData
{
    public float3 pos;
    public float3 dir;
}
// 위는 예제일뿐.. Position, Rotation 으로 이미 Component가 있음

Entity?

  • Component만 갖고 있을 뿐 아무것도 하지않는다.

System

  • 실질적으로 로직을 작성하는 부분이라고 생각하면 됨.

ArcheType?

  • Component 세트가 완벽하게 동일한 모든 엔티티를 그룹화 한 것.
  • Entity에 Component 삽입/삭제 시 메모리 재배치가 되므로 신중히 코딩해야함. 다른 그룹 이동이라 생각하면 쉬움.

    유니티 블로그에선 이렇게 설명한다.

    엔티티에서 컴포넌트를 추가하거나 제거하면 원형에 변화가 생깁니다. 이 경우 현재 청크에 있는 엔티티가 새로운 원형 청크로 이동하게 되어 해당 청크에 발생된 공백을 메꿀 수 있도록 이전 청크의 마지막 엔티티를 백스왑합니다.

Chunk?

  • 16k크기의 하나의 원형에 속한 Entity의 Component 배열.
  • Archetype은 이 chunk의 연결리스트로 구성되어 있음.

이해하기 쉽게 그림으로..

_

태그:

카테고리:

업데이트: