Ape ECS 소개(js!)

누군가가 ECS 라이브러리를 발표하거나 ECS와 관련이 있을 때마다 게시물은 ECS가 무엇인지 설명해야 한다.이 게시물들은 항상 틀렸다. 왜냐하면 약간의 실현을 추가하지 않으면 설명할 수 없기 때문이다.Wikipedia article마저 이 함정에 빠졌다.나는 전통을 깨뜨리지 않을 것이다.
먼저 https://github.com/fritzy/ape-ecs에서 Ape ECS를 찾을 수 있으며 다음과 같은 방법으로 프로젝트에 설치할 수 있습니다.
npm install ape-ecs

그래, 그런데 ECS가 뭐야?
ECS는 인스턴스의 각 부분에 이름을 지정하는 솔리드 어셈블리 시스템(Entity Component System)을 나타냅니다.그것은 게임과 시뮬레이션 개발에 쓰인다.
실체는 유일한 표식이며, 이와 관련된 구성 요소나 구성 요소의 실례에 의해 정의된다. (어, 우리는 이미 실현되기 시작했다.)
구성 요소는 실체와 관련된 데이터 형식의 유일한 표식 실례입니다.
시스템이 어셈블리에서 작동합니다.
그 사상은 논리와 데이터를 분리하는 것이지 논리로 데이터를 봉인하는 대상 프로그래밍이 아니다.근데 어떻게 하지?좋아, 우리는 반드시 세부 사항에 들어가야 해.
일반적으로 시스템은 하나의 함수 또는 하나의 클래스(Ape ECS에서 내장된 시스템 클래스를 덮어쓰거나 하나의 함수만 사용할 수 있음)로 중력과 같은 단일 작업을 할 수 있다.
대부분의 실현은 모든 실체나 주어진 유형의 모든 구성 요소를 가져오는 것이 아니라 실체와 구성 요소를 조회하는 방법이 있다.최소한 하나의 구성 요소 형식을 가진 모든 실체를 연결하거나 집합해서 얻을 수 있습니다.일부 ECS는 더 높은 수준의 쿼리like Ape ECS Queries를 구현합니다.
class Gravity extends ApeECS.System {

  update(currentTick) {

    const frameInfo = this.world.getEntity('GameLoop')
      .getOne('FrameInfo');
    const entities = this.createQuery()
      .fromAll('Position', 'Vector')
      .execute();
    for (const entity of entities) {
      const vector = entity.getOne('Vector');
      vector.y += frameInfo.deltaTime * 9.807;
      vector.update();
    }
  }
}
ECS의 신기한 점은 우리의 중력 시스템이 벡터와 위치가 있는 모든 물체에 작용한다는 것이다.우리는 그것을 구체화할 수 있지만, 더 중요한 것은 우리가 무관심한 일이다.중력은 정령, 인공지능, 무기, 효과 등이 있든 없든 이런 부품을 가진 모든 실체에 작용한다.우리는 중력이 그것에 작용하는지 아닌지를 확인하기 위해 유형의 차원 구조에 의존할 필요가 없다.

ECS를 사용해야 하는 이유
만약 당신의 게임이 복잡하고 동적이거나 시뮬레이션이라면 논리와 데이터를 분리하면 많은 이익을 얻을 수 있다.우선, 당신은 실체의 동적 조합을 가지고 있다.
유저를 인간의 달리기에서 기계사의 제어로 바꾸고 싶습니까?간단하지만 PlayerControl 구성 요소를 mech 솔리드에 추가하면 됩니다.캐릭터를 별도의 팔로 바꾸고 싶으세요?추가 팔 조립품만 추가하면 장비 시스템이 다른 두 팔처럼 그것을 처리할 것이다.
시스템이 결합을 풀 때, 그것들 사이의 상호작용이 더욱 크다.이들 중 한 그룹은 기본적으로 서로 연결된 파이프 입력과 출력으로 같은 구성 요소에 작용하거나 검사할 수 있다.이는 높은 수준의 데이터 집적을 초래하여 Emergent Behavior를 초래했다.중력 시스템의 예에서, 그것은 벡터를 사용하여 해당 위치를 업데이트하는 운동 시스템과 간접적으로 상호작용할 것이다.드워프 요새의 많은 시스템이 상호작용하여 고양이를 죽이는 이야기가 있는데, 이것은 매우 재미있는 이야기다.
또 다른 장점은 하나의 함수 (시스템) 를 실행하면 여러 실체 사이를 순환하는 것이 여러 실체 사이를 순환하고 모든 실체에서 일련의 방법을 운행하는 것보다 더 효과적이다.데이터가 분리될 때, 서열화된 데이터와 저장 상태도 매우 쉽다.폭설 간수 건축사는 그것을 어떻게 만드는지 이야기했다.

그래, 그런데 왜 원숭이 ECS야?
그것의 성능은 좋고 유연하며 간결한 특징도 있다.
그 이유는 다음과 같습니다.
  • 실체의 고급 조회.
  • 영구화 검색(인덱스)은 실체 구성의 변경에 따라 업데이트됩니다.
  • 어셈블리의 솔리드에 대한 참조 특성(EntityRef, EntitySet, EntityObject)
  • 인용된 실체가 삭제되면 이 속성은null로 업데이트됩니다.
  • 구독은 인용된 이벤트를 추가하고 삭제할 수 있습니다.
  • 실체에서 실체 구성 요소를 인용하는 역방향 조회.
  • 모든 시스템이 각 프레임을 실행해야 하는 것은 아닙니다.
  • 내보내기/가져오기는 구성 요소 레벨의 서열화된 구성을 사용하여 저장/복구 상태를 지원합니다.
  • 100% 테스트 커버율.
  • 지난 1년 동안 저는 여가 시간, 특히 격리, 이 문제를 해결하는 원형을 탐색하여 정확한 실현과 기능집을 찾았습니다.
    자바스크립트에 대한 다른 ECS 구현도 많지만 대부분fairly naive or merely instructive이다.
    너도 사용할 수 있다Mozilla's ECSY. 좋은 선택이다.being layed-off에도 불구하고 일부 개발자들은 계속 노력하겠다고 약속했다.

    Ape ECS 1.0
    오늘 Ape ECS 1.0을 발표하겠습니다.특히 API 문서는 포괄적입니다.그것은 100%의 테스트 커버율을 가지고 있다.나는 이미 그것의 사용과 성능에 대해 테스트를 진행하였다.Ape ECS가 준비되어 있습니다!
    나는 이 글을 발표할 수 있어서 매우 기쁘다. 특히 올해가 얼마나 어려운지 고려할 수 있다.나는 마침내 그것을 더욱 광범위하게 토론할 수 있어서 매우 기쁘다. 그리고 그것을 1.0이라고 부른다.
    나는 너희들의 문제, 건의와 공헌을 듣기를 기대하고 있다.미결 문제 및 인출 요청on Github.마음대로 나를 찌르거나 이간질해 주십시오(Fritzy #5972).문서에 대한 조언을 해 주십시오!
    업데이트 09/27: 첫 번째post-1.0pull-request!

    Ape ECS의 다음 단계는 무엇입니까?
    소프트웨어는 영원히 완성되지 않을 것이다!나는 Ape ECS에서 계속 일할 것이다.
  • 이것example game Missile Orders은 아직 완성되지 않았고 ECS의 장점도 충분히 보여주지 못했다.
  • 검색을 포함하는 기준 테스트를 확장하고 이를 바탕으로 더 많은 최적화를 하고 싶습니다.
  • 나는 명령을 추가하고 이벤트를 확장하며 스크롤과 빠른 속도를 실현하여 지연 방지와 네트워크 수정 지원을 지원할 계획이다.
  • 문서에는 수정, 추가 모델 및 예제가 필요합니다.
  • 만약 당신이 이런 일을 하고 싶다면, 우리에게 연락하세요!

    대단히 감사합니다
    초기 구현 피드백, 문서 제안 및 TypeScript 정의에 감사드립니다!
    플래카드 사진 고마워요!

    좋은 웹페이지 즐겨찾기