* 작년부터 개인 프로젝트를 진행하며 공부한 내용을 정리하는 포스팅입니다.

 

ECS란 무엇인가

Entity - Component - System 의 줄임말로, 각 용어에 대해 간단히 설명하자면 아래와 같습니다.

 

  • Component  - 데이터 집합
    • 요소를 이루는 데이터 집합
    • ex
      • position - 위치의 데이터만 가짐 (x,y,z)
      • rotation - 방향의 데이터만 가짐 (x,y,z)
  • Entity  - 컴포넌트 집합
    • 하나의 오브젝트를 이루는 데이터 집합의 집합 
    • ex
      • character - position, rotation 컴포넌트를 가짐.
  • System - 데이터들을 가공하는 작업 ( method 개념)
    • ex
      • MoveSystem - position, rotation 컴포넌트를 가진 엔티티들을 대상으로 키 입력시 position의 데이터를 변경하기만 한다.

 

기존의 객체 지향 개념(OOP) 이 아닌 데이터 지향 방식(DOD)의 개념으로, 데이터 지향은 저장되는 데이터의 위치를 집적시켜 캐시 히트율을 높여 속도를 끌어올리는 목적의 개념으로 알고있습니다.

 

 * 데이터 지향 부가 설명 및 운영체제 지식

  - 프로그램에서 데이터 필요시 CPU 캐시공간을 먼저 검사하고, 거기 없으면 메모리(램)에서 해당 데이터를 가져와서 사용합니다. (메모리에서 가져올 때는 필요 데이터 주변의 데이터를 뭉태기로 캐시에 가져옵니다. 그 주변 데이터를 다음에 사용할 확률이 크기때문이죠) 이때 CPU 캐시에서 바로 가져오느냐, 메모리에서 가져와서 사용하느냐의 속도차이는 아마 몇 십배일거에요. 즉, 캐시에 미리 사용할 데이터가 없을 수록 속도는 몇십배씩 느려진다는 거죠.  그래서 데이터 지향 방식은 데이터들을 한 곳에 몰아 넣어서 캐시 적중률을 늘려 속도를 올릴 수 있는거죠. (객체 지향은 객체에 따라 데이터가 위치가 분산될겁니다.) 

 

Unity Scripting 방법

* 현재 unity에서 제공하는 방식은 3가지 입니다.

  1. Classic ( 현재 일반적으로 사용하는 컴포넌트 방식입니다.)
  2. Hybrid ECS 
    • Component + ECS 방식입니다.
    • 에디터상의 작업은 기존의 Classic 방식을 따르고, 코딩은 ECS 방식으로 하는 형식입니다. 아마 ECS의 진입장벽을 낮추고, ECS의 속도면 이점도 어느정도 갖추기 위해 만들어졌을거 같네요.
  3. Pure ECS
    • 완전한 ECS 방식입니다.
    • 기존의 Classic 방식과는 객체 생성및 등록 방식이 확 바뀝니다. 거의 모든 걸 스크립트상에서 처리하기에 진입장벽이 많이 높습니다.

 

장점 & 단점

  • 장점

    • 재사용성이 높다. / 상호 의존도가 낮다
      • 위 부분은 객체지향의 장점에도 포함되지만 개인적으로 사용 경험상, 데이터 지향 방식이 더 활용도가 높다고 느껴집니다.
      • 데이터 지향의 시스템은 자기가 필요한 엔티티 집합을 검색해 로직을 돌리는 방식이고, 엔티티는 시스템의 검색에 찾아지도록 필요 컴포넌트들을 포함시켜 만들어진 집합입니다. 즉, 특정 엔티티가 특정 시스템에 돌아가게 하고싶다면, 시스템이 필요로하는 컴포넌트만 엔티티에 추가만 하면 끝인거죠.
        • 이런 방식으로 시스템과 컴포넌트를 구성해놓으면 엔티티는 자기가 원하는 것만 골라 재사용하기 용이하게 느껴집니다.
        •  그리고 실제 설계 / 코딩을 할 때도 필요한 컴포넌트를 개별로 시스템에서 가져다 사용하기때문에 다른 시스템/ 엔티티에 영향도가 적습니다. (상호 의존성 낮음)
    • 유지보수가 용이하다.
      • 위의 장점과 일맥상통합니다.
        • 시스템 별로 필요 엔티티만 집약되어있기에 시스템별로 찾고 고치기가 쉽습니다. 
    • 실행 속도가 빠르다
      • 네, 엄청 빠릅니다. (이건 다음 포스팅에서 검증하도록 하겠습니다)
  • 단점

    •  진입장벽이 많이 크다.
      • Pure가 특히 높습니다. Hybrid는 기존의 방식을 어느정도 쓰기때문에 사실 ECS 개념만 좀 숙달되면 금방하는데, Pure는 스크립트로 거의 모든 걸 진행하여 에디터 UI상의 이점을 많이 뺏깁니다.
    •  디버깅이 힘들다.
      • Pure의 단점으로, 위의 단점과 일맥상통합니다.
      • Pure는 에디터상의 하이러키창에 오브젝트가 안나옵니다. 그래서 하이러키창을 자주 활용하여 디버깅하시는 분은 꽤 당황스러울 수 있습니다.
    • 베타 버전 (개인적으로 최고 단점으로 뽑습니다.)
      • Unity에서 기존에 제공하던 컴포넌트들을 직접 구현해야 할 수 있습니다. 
        • 일부 컴포넌트가 ECS형태로 아직 제공이 안됩니다 ㅠㅠ  자주 사용하는 Physics, animation관련 컴포넌트도 없는게 꽤 있습니다.

 

저는 아직 Pure ECS는 많이 어색하고 어렵더군요. 그래서 앞으로의 포스팅은 Hybrid ECS 위주로 진행하겠습니다. 애초에 개인 프로젝트도 Hybrid ECS를 이용해 만들기도 했거든요.

 

다음 포스팅은 유니티에서 제공해주는 샘플 프로젝트를 이용해 실험해본 간단한 성능 벤치마크를 하도록 하겠습니다.

대체 얼마나 기존에 비해 성능이 빨라질지 간단하게 실험한 결과입니다.

 

* 개인이 공부하며 하는 포스팅이기에 잘못된 부분이 있을 수 있습니다.

 혹시 잘못되거나 문제시 되는 부분이 있으면 지적 부탁드립니다.

Posted by 검은거북

블로그 이미지
프로그래밍 공부 요약 및 공부하며 발생한 궁금증과 해결과정을 포스팅합니다.
검은거북

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.7
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

최근에 올라온 글

최근에 달린 댓글

글 보관함