탱크의 세계에서 어떤 엔진이 만들어집니다. 새 엔진을 테스트하십시오. 새로운 게임 엔진

새로운 비디오 카드를 구입하거나 새로운 WOT 엔진을 발표 할 시간입니다.

WG FEST는 완전히 새로운 탱크의 출구를 발표했습니다. 사실, 새로운 엔진, 사운드, HD 카드로서 이미 완전히 다른 게임입니다. 시각적 인 개선에도 불구하고 개발자들은 성과가 떨어지지 않는다는 것을 약속합니다. 30fps를 가지고 노는 경우 새 엔진이 동일합니다.

하나의 트레일러 만 사용할 수있는 동안 :

현재 알려진 것은 무엇입니까?

  • 이 업데이트는 2018 년 3 월에 발표 될 예정입니다.

  • 새 엔진이 불렀습니다 핵심...에 (현재의 WOT 엔진) Neegen은 과거에 들어갑니다.
    • 기존 엔진에서 아무도 개발자를 만족시킬 수 없으므로 처음부터 모든 것을 수행하기로 결정했습니다.
    • 개발 중에는 4 년이 걸렸습니다 : 엔진 자체와 다른 해에는 콘텐츠 (카드)를 만드는 데 3 년이 걸렸습니다.
  • 성능을 추정하기 위해서는 새로운 게임에 적합한 방법을 평가할 수있는 결과를 기반으로 한 결과를 기반으로 테스트를 수행 할 수있는 특별한 소프트웨어 encore를 이미 다운로드 할 수 있습니다.
    • 앙코르는부터 시작할 수 있습니다 세 가지 모드 그래프 : 최소, 중간 및 울트라.
    • 테스트는 3 분이 걸리고 새로운 그래픽 기능과 효과를 입증하여 스테이지의 재생을 보여줍니다.


탱크 테스트 결과의 세계 앙코르.

  • HD 카드 - 모든 위치가 높은 선명도 하에서 엽니 다. 그리고 이것은 풍경, 텍스처, 조명, 소리, 효과, 환경 등 모든 측면에 적용됩니다.


HD 카드로 변환 된 전체 목록.

  • 완전히 재기류 된 사운드 트랙. 이제 각 카드에는 고유 한 위치 분위기를 전송하는 자체 음악이 있습니다.
  • 그들은 최적화에 대한 작업이 잘되고 FPS의 강한 손실이 없어야합니다.
  • 장르 오리엔테이션 : 모든 장르의 3D MMO;
  • 플랫폼: PC, PS3, Xbox 360, iOS (iPad), 웹;
  • 프로그래밍 언어: C ++, Python;
  • 특허: 인디와 상업;
  • 오픈 소스 코드 : 지불이 제공되거나 제공되지 않습니다.
  • 멀티 플레이어 : 클라이언트 서버;
  • 장점 : 최적화 된 모든 가장 현대적인 기술에 대한 강력한 지원, iOS 지원, 그러한 기회를 위해 싸게;
  • 단점 : 무료는 제공되지 않습니다.
  • 엔진 개발자 : BigWorld Tech, Inc.

    BigWorld 엔진은 MMO 게임을 만드는 가장 진보 된 3D 엔진입니다. 그것에는 "탱크의 세계", "Titans의 Pealm의 Titans의 Pealm"과 다른 세계적 수준의 게임 개발자들의 다른 게임들과 같은 게임으로 만들어집니다. 이 엔진에는 15mmo 이상의 게임이 있습니다. 그는 BigWorld 기술이 개발 중입니다.

    엔진 최적화를 통해 멋진 그래픽으로 낮은 소비 게임을 만들 수 있습니다. 엔진을 사용하면 iOS에서 게임을 포트 할 수 있습니다. C ++ 프로그래밍 언어로 작성된 게임 논리의 구현은 편리한 스크립트 파이썬에서 수행됩니다. 강력한 도구와 클라이언트 - 서버 엔진이 있습니다. 사운드의 경우 Fmod 라이브러리가 지원되며 다른 라이브러리는 플러그인 시스템을 통해 연결됩니다. XML 및 MySQL Bases에서 작동합니다. 툴킷에는 강력한 세계 편집기, 모델 편집기 및 입자 편집기가 있습니다.

    그것은 가격이 매우 접근 가능합니다. BigWorld를 빌드하십시오 : 인디 에디션은 $ 299에 불과합니다. BigWorld : 인디 소스 에디션 - $ 2,9999; BigWorld : 상업용 판 - 개별적으로 협상했습니다.

    이 고급 엔진은 유형의 다른 세계 엔진의 가능성이 열등하지 않습니다. 엔진은 러시아어, 한국인, 미국 및 일본어로 제공됩니다. 문서가 있으며 브라우저에서 작업 할 수 있습니다. 일반적으로 지식과 근면이있는 경우 일할 수 있습니다.

    이미 타사 라이선스에서 사용할 수 없으므로 Wargaming은 그의 엔진의 확산을 포기하기로 결정했습니다.

    공식 사이트: http://www.bigworldtech.com.





    BigWorld 기술 도구 체인은 게임의 품질과 적시성을 향상시키는 완벽한 엔드 - 투 - 엔드 MMOG 콘텐츠 생성 시스템을 제공합니다. 모든 도구는 대규모 팀 환경에서 게임 자산의 협력 생산을 위해 설계되어 자원의 효과적인 사용을 보장하고 부드러운 콘텐츠 파이프 라인을 사용합니다.

  • 10 월 2 일부터 10 월 8 일까지 다양한 지역의 공동체 및 블로거 대표는 Minsk Development Center에있었습니다. Polish DOM1N Portal은 MatchyHK (Asian Community Communtorutor)가 더 큰 노출을 게시합니다. 답변에서는 사소한 부정확성이있을 수 있습니다. 원본은 2 번 번역되었습니다 : 영어 - 폴란드어 - 러시아어.

    Alexey (INAKI) 일린은 탱크 프로젝트 세계의 세계 생산 업체뿐만 아니라 다른 개발자뿐만 아니라 질문에 대한 책임이 있었다. 거대하고 상세한 선택. 2 부.

    4 장. 경제 및 게임 메커니즘:

    * 일부 선수들은 정말로 "광대 위장"(예 : 애국자 또는 자유권)을 좋아하지 않습니다. 개발자들의 의견은 무엇입니까?
    - 이것은 아주 좋은 질문입니다! 우리는 일하고 있습니다 새로운 시스템 플레이어가 자동차를 자세히 사용자 정의 할 수있는 사용자 정의.
    우리는이 시스템을 아주 잘 만들고 싶어하므로 출구의 타이밍을 즉시라고 부를 수는 없으므로 우리는 그것을 입력하기 위해 서두르지 않습니다. 그러나 도움을 받아 우리는 플레이어에게 탱크의 많은 질감과 맞춤화를 제공 할 수 있습니다.

    // 재미있는 이야기:
    우리가 Skorpion G에 들어갔을 때 우리는 실제로 3 개의 시각적 모델을 만들었습니다. 우리 모두가 알고있는 일반적인 Skorpion (독일어 회색)과 Skorpion이있었습니다. 세 번째는 매우 바와 같은 / 비현실적인 질감을 가지고 있으며 게임에 적합하지 않은 것으로 간주됩니다.
    * 새 해에 서랍이있는 일이 일어난 일은 무엇입니까? Wargaming은 CS : Go 또는 Overwatch로 스킨이있는 상자 시스템을 통해 생각합니다.
    * 군함 세계에서 컨테이너 시스템과 비슷한 것을 입력 할 수 있습니까?
    - 우리는 그 아이디어를 좋아합니다. 그러나 WOT와는 달리, 새로운 게임...에 경제 개혁이 게임에서 개최 될 때 컨테이너가 도입되었습니다. 우리는 과거의 숲을 고려해야 할 필요가 있으므로 더 어렵습니다. 게임 내 경제를 변경하는 것을 소개하는 것은 어렵습니다. 우리가 그런 식으로 들어가면 우리는 그것을 매우 신중하게 계획해야합니다. 이는 혁신을 보상하기 위해 이익을 줄이기 위해 이익을 줄이면 플레이어의 부정적인 인상을 수반 할 수 있으며, 덜 대출을받지 않는다고 가정 할 것입니다.
    * 무작위로 가변성이 더 많을 것입니까? 예를 들어, 야간 전투 또는 날씨는?
    - 우리가 밤 전투 또는 날씨를 소개하면 이러한 변경 사항이 화장품만을 결정하거나 예를 들어 게임 플레이에도 영향을 미치는지 여부를 결정해야합니다. 밤 또는 모래 폭풍우에서 볼 수있는 범위를 줄입니다.
    * "금지"XVM이라고 생각하십니까?
    - XVM은 XVM에 초점을 맞추는 것 외에도 XVM이 게임의 분개를 수반 할 수 있음을 알고 있습니다. 그러나 우리는 게임에서 XVM을 철회 할 수는 없습니다. XVM은 또한 통계를 표시하는 것 외에도 많은 다른 기능을 제공합니다. 우리는 XVM 개발자와 긴밀히 협력합니다. 일부 플레이어는 전투 전략 (예 : 연합자 자주색 플레이어를 타거나 적에 집중하는 불행히도)을 계획하는 XVM을 사용합니다.
    2 년 전 우리는 XVM에 대한 통계를 수집하고 통계 기능없이 XVM을 50 % 이상 사용하는 것을 깨달았습니다. 따라서 게임 클라이언트에 이러한 기능을 도입하면서 XVM 불필요하게 작동합니다. 최근에 우리는 우리 자신의 등급 시스템을 도입했습니다. 우리는보다 정확한 측정 시스템을 만들 수 있다고 생각합니다. 이렇게하면 플레이어에게보다 정확한 평가 및 비교 시스템을 제공합니다.
    동시에, 회사는 워지먼스 API로부터 데이터를 받기 위해 외국 서비스를 금지 할 수있는 가능성에 따라 연구를 수행했습니다. 이는 많은 중요한 서비스에 대한 데이터 분석에 문제가 발생합니다. 우리는 그것에 대해 일하고 있습니다.
    * 전투에서 플레이어를 숨길 수 있습니까?
    - 불행히도, 우리는 이것이 좋은 생각이라고 생각하지 않습니다. 일부는 봇에 대해 놀고 있다는 것을 계산할 수 있습니다. 또한 게임에서 사회적 관계가 어렵습니다. 플레이어가 일족에 있는지 아는 것은 불가능합니다. 클랜이 새로운 선수를 찾는 것이 어려울 것입니다.
    * "일반 전투"가있는 것들은 어떻게됩니까?
    - 일반 전투 - 성공적으로 플레이어가 좋아하며 카드는 통계의 관점에서 균형을 맞 춥니 다. 그러나 아시아와 미국에서는 10 LVL에 많은 수의 플레이어가 부족하고 계급 전투의 병렬 출시로 인해 매우 적은 양의 GS가 수집됩니다. 우리는 그 순간에 규칙이며 사용자 정의합니다.
    * 포병 짜증나, 아직 삭제하거나 다시 개조 할 수 있습니까?
    - 우리는 포병을 제거하지 않을 것입니다. 이 수업은 다른 플레이어의 행동을 예측하는 것을 좋아하는 사람들을위한 것입니다. 이 수업을 정말로 좋아하는 사람들의 비율이 있으며 어떤 사람들은 포병만을합니다. 이제는 화재에서 살아남을 수 있으며, 바닐 Zota에서 죽지 않을 수도 있습니다.

    제 5 장 게임 엔진 :

    * HD 카드를 도입하여 127 fps에서 게임 엔진의 전류 제한을 제거합니까?
    - 우리는 고품질 모니터 (144 및 165Hz)의 사용이 증가하고 있습니다. 127 fps의 제한은 클라이언트 자체 때문이 아니라 BigWorld의 이전 서버 부분으로 인해입니다. 우리가 이미 말했듯이 클라이언트 부분은 실질적으로 다시 재기록되었습니다. 마찬가지로 서버 구성 요소가 다시 작성되고 FPS 제한이 필요하지 않습니다. 우리는 그것을 제거하거나 교체하려고합니다. 테스트를 거쳤지만 샌드 박스에 추가되지 않을 수 있습니다.
    어제 모든 것이 블록없이 나갔다.

    * 총기 / 이상한 카메라 동작 (예 : 장애물이있는 경우 저격 모드에서 정상 또는 반대로 이동할 때)은 HD 카드뿐만 아니라 공통 서버에서도 매우 짜증나는 것입니다. 고정 될 것인가?
    - 우리는이 문제에 대해 알고 있습니다. 불행히도, 우리는 현재 명시 적 솔루션이 없습니다. 그러나 파워 플로즈 맵을 입력하는 순간부터 카메라의 행동의 논리를 수정했습니다. 이것은 상황을 개선했지만 완벽하지는 않습니다. WOT에서 카메라의 동작은 기존의 범인보다 훨씬 어렵습니다 (예 : 타워 및 케이스의 회전 속도, 예를 들어 많은 요인을 고려해야합니다.) 아니오 간단한 솔루션 이 문제가 있지만 새로운 기술 로이 문제를 해결하기를 바랍니다.

    제 6 장 기타 :

    일부 플레이어는 민감도 설정에서 디지털 매개 변수를 입력하였습니다. 그것은 노트가 있고 나중에 고려 될 것입니다. 그러나 통계에 따르면 플레이어가 매우 적은 플레이어가 제어 설정을 변경합니다.
    - 족장 MK의 운명. 6 - 불행히도 게임에 들어갈 것 같지는 않습니다. 우리가 그것을 소개하고 싶지 않은 것처럼, 우리는 그것이 정복자와 함께 탐험하기를 원하지 않을 것입니다. 유사한 게임 플레이와 함께 낮은 수준의 적절한 후보자를 찾으면 게임에서 족장을 입력하는 것에 대해 생각할 것입니다.
    * WG는 루마니아 지점의 도입에 대해 생각합니까?
    - 불행히도 우리는 루마니아가 자신의 지점을 끌어들이는 충분한 탱크가 충분하다고 생각하지 않습니다.

    * 언제 탱크를 연마할까요?
    - 여전히 폴란드 지점에서 일하고 있지만, 우리는 이미 그녀를 위해 모든 차를 발견했습니다. 따라서 가능한 한 빨리 이러한 탱크를 소개하려고 노력할 것입니다. 그러나 Annon 특정 날짜에 너무 이르다!

    * SERB (SERB)는 어디에 있습니까? 그는 무엇을합니까? 그는 음력 기지의 프로젝트에서 일합니까?)
    - 세르브는 우리와 함께 작동합니다. 그것은 음력 기지의 프로젝트에서는 작동하지 않습니다. 그는 이제 다른 vauchiming 프로젝트에서 일하고 있습니다.

    이 이야기는 3 년 전에 시작되었습니다. 우리의 작은 다바 회사는 전쟁의 일부가되었으며, 우리는 다음과 같은 프로젝트에 대해 생각하기 시작했습니다. 3 년 전 Mobail이 무엇인지 상기시키기 위해, 나는 클랜의 충돌이나 퍼즐 & 드래곤이나 많은 아주 잘 알려진 프로젝트가 없었습니다. 그런 다음 중간 코어가 시작되었습니다. 시장은 오늘날보다 여러 번 적었습니다.

    처음에는 큰 "탱크"에서 새로운 사용자를 끌어 들이는 여러 작은 게임을 만드는 것이 아주 좋은 생각이 될 것입니다. 많은 실험이 끝나면 그것이 작동하지 않았다는 것을 밝혀 냈습니다. 우수한 전환에도 불구하고 모바일 응용 프로그램, 전송 휴대 전화 PC는 사용자를위한 절벽으로 밝혀졌습니다.

    그런 다음 개발에서 우리는 여러 게임을 가지고있었습니다. 그 중 하나는 동작 이름 "스나이퍼"를 입었습니다. 주요 게임 플레이 아이디어는 AI 관리 및 응답으로 공격 할 수있는 다른 탱크에 따라 방어적으로 탱크 서있는 탱크에서 스나이퍼 모드에서 촬영되었습니다.

    어떤 시점에서는 서있는 탱크가 매우 지루한 것처럼 보였습니다. 일주일에 우리는 탱크가 이미 서로를 타고 공격 할 수있는 멀티 플레이어 프로토 타입을 만들었습니다.

    이 모든 것이 시작 되었기 때문에!

    우리가 "저격수"의 개발을 시작했을 때, 우리는 다음과 같은 기술을 고려한 기술을 모바일 플랫폼...에 그 당시 일치는 여전히 개발의 초기 단계에있었습니다. 사실, 아직 우리에게 필요한 기술은 없었습니다.

    우리가 부족한 주요한 것은 열린 공간이있는 게임을 만드는 데 중요한 동적 세부 사항으로 풍경 렌더링이었습니다. 화합을위한 제 3 자 도서관이 있었지만, 그들의 품질은 많은 것을 원할 것입니다.

    우리는 또한 C #에서 우리가 개발하는 장치의 최대 값을 짜낼 수 없으며 항상 제한적일 수 없습니다.
    Unreal Engine 3은 또한 비슷한 원인의 수에 적합하지 않았습니다.

    결과적으로 우리는 엔진을 개선하기로 결정했습니다!

    그는 이전의 캐주얼 프로젝트에서 이미 그 당시 사용되었습니다. 엔진은 플랫폼과 지원되는 iOS, PC, Mac을 지원하고 Android에서 작업을 지원하고 지원되는 저작력이 뛰어났습니다. 많은 기능이 2D 게임을 만드는 데 작성되었습니다. 즉, 2D로 일할 좋은 UI와 많은 모든 것이있었습니다. 우리 게임 중 하나가 완전히 3 차원 이었기 때문에 3D 부분의 첫 번째 단계가있었습니다.

    우리가 엔진의 3D 부분에서 우리가 가진 것 :

    • 가장 간단한 그래프 장면입니다.
    • 정적 메시를 그릴 수있는 능력.
    • 스켈 레탈 애니메이션으로 애니메이션 메쉬를 그릴 수있는 기능.
    • collada 형식에서 개체 및 애니메이션을 내 보냅니다.
    일반적으로 심각한 현대 엔진의 기능에 대해 이야기하면 매우 작았습니다.

    일의 시작

    그것은 모두가 풍경을 그릴 수있는 능력의 증거로 시작했습니다. 모바일 장치: 그렇다면 iPhone 4와 iPad 1이었습니다.

    며칠 동안 일한 후, 우리는 오히려 잘 작동 한 완전히 기능적인 동적 인 풍경을 받았고, 8MB의 메모리 중 일부를 요구 하고이 장치에서 60fps를주었습니다. 그 후 우리는 본격적인 게임 개발을 시작했습니다.

    약 6 개월이 지나면 작은 미니 프로젝트가 지금 Blitz가 무엇인지로 바뀌 었습니다. MMO, AAA 품질 및 그 당시에 원래 형태의 엔진이 더 이상 제공 할 수 없을수록 새로운 요구 사항은 완전히 새로운 요구 사항이 완전히있었습니다. 그러나 일은 완전한 스윙으로 끓는 것입니다. 게임은 일하고 잘 작동했습니다. 그러나 성능은 중간,지도의 물체가 거의 없었습니다. 실제로 다른 많은 제한이있었습니다.

    이 단계에서 우리는 엔진에 누워있는 기초가 실제 프로젝트의 언론을 견딜 수 없다는 것을 이해하기 시작했습니다.

    그 시간에 모든 것이 어떻게 작동했는지
    모든 장면 도면은 장면 그래프의 간단한 개념을 기반으로했습니다.

    주요 개념은 두 가지 클래스였습니다.

    • 장면 - 모든 행동이 일어난 장면 컨테이너
    • 장면 위.
    • 시나로 페 노드 - 모든 클래스가 상속 된 장면 노드의 기본 클래스는 장면에있었습니다.
    • MeshinStanCenode - 메쉬 그리기 수업.
    • LodNode - 보트 전환을위한 클래스.
    • switchNode - 클래스가 스위치 객체를 전환합니다.
    • 시나 테노 상속인의 약 15 개 수업.
    시나리오 클래스는 설정을 무시할 수 있습니다 가상 메소드, 사용자 정의 기능을 구현하려면 :
    재정의 할 수있는 주요 기능은 다음과 같습니다.
    • 업데이트 - 업데이트 장면을 만들기 위해 각 노드에 대해 호출 된 함수입니다.
    • Draw -이 노드를 그리는 데 각 노드에 대해 호출 된 함수.
    우리가 직면 한 주요 문제.

    첫째, 성능 :

    • 노드 수가 5000에 도달하면 모든 빈 업데이트 기능을 거쳐서 3ms가 소요됩니다.
    • 비슷한 시간이 드릴 필요가없는 빈 노드로갔습니다.
    • 작업이 항상 다른 방식으로 완료되면서 많은 캐시가 그리워합니다.
    • Parallery가 여러 코어로 작동 할 수 없음.
    둘째, 예측할 수 없음 :
    • 기본 클래스의 코드를 변경하면 전체 시스템의 전체 시스템의 전체 시스템에 영향을 미치는 것입니다. 즉시 시나오드 :: 업데이트의 각 변경이 무엇이든 무엇이든 깰 수 있습니다. 종속성은 더 복잡하고 복잡해졌으며 엔진 내부의 엔진의 엔진의 각 변경은 거의 모든 관련 기능을 테스트 할 수 있습니다.
    • 남은 장면을 다치게하지 않도록 변형시 로컬 변화를 만드는 것은 불가능했습니다. 아주 자주 LODNODE의 가장 사소한 변화 (SHODS 스위칭 용 매듭) 게임에서 무언가를 부러 뜨 렸습니다.

    상황을 개선하기위한 첫 번째 단계

    시작하기 위해 우리는 생산성에 문제를 치료하고 신속하게 만들기로 결정했습니다.

    실제로, 각 노드에 추가 requile_update 플래그를 입력하여 해 냈습니다. 그러한 노드가 업데이트를 호출하는 데 필요한지 여부를 결정했습니다. 그것은 실제로 생산성 향상되었지만 문제의 전체 기억을 창출했습니다. 사실, 업데이트 기능 코드는 다음과 같습니다.

    void scenenode :: update (flags & need_update)) 반환; // 나머지 부분 업데이트. 기능 // 자녀를 처리)
    그것은 우리에게 성능의 일부로 돌아 왔지만 많은 논리적 인 문제가 기다리지 않았습니다.

    lodnode 및 switchnode - 각각 롯지 (거리별로)와 스위칭 객체 (예 : 파괴 및 비파괴)를 전환하기 위해 각각 응답하는 노드는 정기적으로 깨기 시작했습니다.

    주기적으로, 고장을 수정하려고 시도한 사람은 다음을 수행했습니다. 기본 클래스에서 Need_Update를 비활성화했습니다 (결국 간단한 해결책이었습니다). 완전히 눈에 띄지 않는 FPS가 다시 떨어졌습니다.

    Requiber_Update 플래그를 확인하는 코드가 세 번 주석 처리 된 경우, 우리는 급진적 인 변화로 결정했습니다. 우리는 한 번에 모든 것을 할 수 없었기 때문에 우리는 단계적으로 행동하기로 결정했습니다.

    첫 번째 단계는 우리가 우리에게서 발생하는 모든 문제를 해결할 수있게 해주는 아키텍처를 낳는 것이 었습니다.

    • 독립적 인 서브 시스템 간의 의존성을 최소화하십시오.
    • 변환의 변화는 로그 시스템을 끊어서는 안됩니다.
    • 멀티 코어에 코드를 넣는 기능.
    • 이기종 독립 코드가 수행 된 업데이트 기능이 없거나 유사하지 않도록하십시오. 이전의 접착력이없는 새로운 기능으로 시스템을 쉽게 확장합니다. 일부 하위 시스템의 변화는 다른 하위 시스템에 영향을주지 않습니다. 최대 독립 서브 시스템.
    • 최대 성능을 위해 메모리에 데이터를 선형으로 배열하는 기능입니다.
    첫 번째 단계의 주요 목표는이 모든 목표를 수행 할 수 있도록 아키텍처의 변경에 의해 선택되었습니다.

    구성 요소 및 데이터 중심 접근법을 결합합니다

    이 문제에 대한 해결책은 데이터 중심 접근 방식과 결합 된 구성 요소 접근법이었습니다. 더 나아가 나는 성공적인 번역을 찾지 못한 이래로 데이터 중심의 접근 방식을 사용합니다.

    일반적으로 많은 사람들의 구성 요소 접근법에 대한 이해가 가장 다릅니다. 데이터 중심과 동일합니다.

    내 이해에서, 구성 요소 접근 - 필요한 기능이 독립적 인 구성 요소를 기반으로하는 경우입니다. 가장 쉬운 예는 전자 제품입니다. 칩이 있으며 각 칩에는 입력 및 출력이 있습니다. 칩이 서로 들어 오면 연결할 수 있습니다. 이 접근 방식을 바탕으로 전체 전자 산업 전체가 지어졌습니다. 수천 명이 있습니다 다른 구성 요소: 서로 연결하면 완전히 다른 것들을 얻을 수 있습니다.

    이 접근법의 주요 이점은 각 구성 요소가 절연되어 더 독립적이라는 것입니다. 나는 구성 요소가 잘못된 데이터를 사용할 수 있고 수수료가 굽는 것을 고려하지 않습니다. 이 접근법의 장점은 분명합니다. 오늘날 준비된 칩을 거대하게 만들고 새 장치를 수집 할 수 있습니다.

    뭐가 데이터 중심....에 내 이해에서 이것은 디자인의 접근 방식입니다. 소프트웨어프로그램이 프로그램의 기초로 사용되며 논리가 아닌 경우.

    이 예에서는 다음과 같은 수업 계층 구조를 상상해보십시오.

    클래스시나 테노 (// 계층 적 변환 Matrix4 LocalTransform; Matrix4 WorldTransform; 가상 void 업데이트 (); 가상 void draw (); 벡터 어린이; ) 클래스 LODNODE (// LODDISTANCE LOD를 계산하는 데이터 셀프리온; 가상 빌이드 업데이트 (); // 갱신 방법을 켜거나 끄거나 가상 무효 그리기 중 일부를 켜거나 끄려면 갱신 방법을 무시합니다 ( ); / / 현재 활성 로그 만 드러닝 함); 클래스 Meshnode (렌더링 * 메쉬, 가상 void draw (); // mes 그리기);
    이 계층 구조를 무시하는 코드는 다음과 같습니다.

    메인 루프 : rootNode-\u003e update (); rootnode-\u003e draw ();
    이 계층 구조 C ++ 상속에서는 세 가지 다른 독립적 인 데이터 스트림이 있습니다.

    • 변환
    노드는 계층 구조로만 결합하지만 각 데이터 스트림의 처리가 생성하는 것이 좋습니다을 이해하는 것이 중요합니다. 계층 구조의 처리를위한 실질적인 필요성은 변환에만 필요합니다.

    데이터 중심 접근 방식에서 어떻게 보이는지 상상해 보겠습니다. 나는 아이디어를 분명히하기 위해 의사 코드에 쓸 것입니다.

    // 변환 데이터 루프 : (LocalTransformarray의 각 LocalTransform) (WorldTransform \u003d SouthRox-\u003e WorldTransform * LocalTransform;) // LOD 데이터 루프 : (각 LOD 각 LOD) (// LOD 거리를 계산하고 가장 가까운 LOD를 찾으십시오. (LOD); RenderObjectIndex \u003d GetLodObjectIndex \u003d GetLodobjectRenderObjectIndex (LOD); RenderObjectArray \u003d RenderObject;) // 메쉬 렌더링 데이터 루프 : for (rendermesh (rendermesh);)
    사실, 우리는 프로그램의주기를 배포하여 모든 것이 데이터에서 반발되는 방식으로 만들었습니다.

    데이터 기반 접근 방식의 데이터는 프로그램의 핵심 요소입니다. 논리 - 데이터 처리 메커니즘 만.

    새로운 건축물

    어떤 시점에서 우리는 장면의 조직에 대한 엔티티 기반 접근 방식으로 가야한다는 것을 분명히해서 엔티티가 많은 독립적 인 구성 요소로 구성된 본질이었던 곳이었습니다. 나는 구성 요소가 완전히 임의적이고 서로 쉽게 결합되기를 원했습니다.

    이 항목에 대한 정보를 읽고, 나는 T-Machine 블로그를 가로 질러 왔습니다.

    그는 나에게 많은 대답을 주었지만, 주요 대답은 다음과 같습니다.

    엔티티에는 어떤 논리가 없으며 ID (또는 포인터)입니다.
    엔티티는 ID (또는 포인터)에 속한 ID 구성 요소 만 알고 있습니다.
    구성 요소는 데이터 만 데이터입니다. 구성 요소에는 어떤 논리가 포함되어 있지 않습니다.
    시스템은 특정 데이터 세트를 처리하고 출력에서 \u200b\u200b다른 데이터 세트를 압출 할 수있는 코드입니다.

    Java에서 개발 중이라면 정말로 그것을 보는 것이 좋습니다. 매우 간단하고 개념적으로 정확한 프레임 워크. 현재까지 그는 무리의 언어로 살아 있습니다.

    Artemis는 오늘날 ECS (엔티티 구성 요소 시스템)라고합니다. 엔티티, 구성 요소 및 데이터 중심에 기반한 장면을 구성하는 옵션은 꽤 많이 있습니다. 그러나 우리는 ECS 아키텍처에 왔습니다. 그러나 일반적으로 받아 들여지는 방식이 얼마나 일반적인지 말하기는 어렵지만 ECS는 다음 엔티티가있는 엔티티, 구성 요소, 시스템이 있음을 의미합니다.

    다른 접근법과 가장 중요한 차이점은 다음과 같습니다. 구성 요소의 논리 동작의 필수 부족 및 시스템의 코드 분리.

    이 항목은 "정통"구성 요소 접근법에서 매우 중요합니다. 첫 번째 원칙을 끊으면 많은 유혹이 나타납니다. 구성 요소의 상속을하는 첫 번째 중 하나입니다.

    유연성에도 불구하고, 대개 파스타와 함께 끝납니다.

    처음에는이 접근 방식으로 비슷한 방식으로 행동하는 많은 구성 요소를 만들 수 있지만 조금 다르게 만듭니다. 일반 구성 요소 인터페이스. 일반적으로 상속의 함정에 또 낙오 될 수 있습니다. 예, 고전적 유전보다 조금 더 낫지 만이 함정에 들어 가지 않도록 노력하십시오.

    ECS는 클리너 접근법이며, 결정합니다 더 많은 문제.

    예를 보려면 Artemis에서 작동하는 방법을 볼 수 있습니다.

    나는 그것이 우리에게 어떻게 작동하는지 예제에서 당신을 보여줄 것입니다.

    주 클래스 컨테이너는 엔티티입니다. 이것은 구성 요소 배열을 포함하는 클래스입니다.

    두 번째 클래스는 구성 요소입니다. 우리의 경우에 그것은 단지 데이터 일뿐입니다.

    오늘 엔진에서 사용되는 구성 요소 목록은 다음과 같습니다.

    Enum Etype (transform_component \u003d 0, respon_component, lod_component, debug_render_component, switch_component, camere_component, light_component, camera_component, light_component, partip_component, bullet_component, component_component, animation_component, collision_component, // 여러 개의 인스턴스 physics_component, action_component, // 동작, 논리에 영향을 미칠 수있는 스크립트보다 단순한 것, 여러 개의 script_component, // 여러 인스턴스가 될 수 있습니다. 이제는 훨씬 나중에 발생합니다. user_component, sound_component, custom_properties_component, static_occlusion_component, static_occlusion_data_component, quality_settings_component, // 모델의 형식을 탐지하기위한 FastName로 입력 SpeedTree_Component, Wind_Component, Wave_Component, skeleton_component, / / 디버그 구성 요소 - 아래의 모든 것은 직렬화 된 Debug_Components, static_oclusion_debug_draw_component, Component_Count (Component_Count);
    Thanvest Class는 SceneSystem입니다.

    / ** \\ 간략한이 함수는 장면에 등록 된 엔티티가 등록 할 때 호출됩니다. 정렬은 엔티티가 모두 addentity를 호출 할 필요가 있습니다. \\ param 엔티티 엔터티는 * / 가상 void 레지스터 (엔티티 * 엔티티)를 추가했습니다. / ** \\ 간략한이 함수는 장면에서 등록되지 않은 엔티티가 등록 된 엔티티가있을 때 호출됩니다. 정렬은 엔티티가 필요한 모든 구성 요소를 가지고 있으며 전화해야합니다. remerenentity. \\ param 엔티티 엔티티 우리는 방금 제거 된 * / 가상 복잡함 * 엔티티;
    RegiStertity 함수, unregistertity는 장면에서 엔티티를 추가하거나 삭제할 때 장면의 모든 시스템에 대해 호출됩니다.

    / ** \\ 간략한이 함수는 모든 구성 요소가 장면에 등록 될 때 호출됩니다. 정렬은 엔티티가 모두 addentity를 호출 할 필요가 있습니다. \\ param 엔티티 엔티티가 구성 요소를 추가했습니다. \\ param 구성 요소 엔티티에 방금 추가되었습니다. * / 가상 무효성, 구성 요소 * 구성 요소); / ** \\ 간략한이 기능은 모든 구성 요소가 장면에서 등록되지 않은 경우 호출됩니다. 정렬은 모든 것이 모두 필요한 것입니다. 제거를 호출해야합니다. \\ param 엔티티 엔티티는 \\ param 구성 요소에서 구성 요소를 제거했습니다. \\ param 구성 요소 엔티티에서 방금 제거되었습니다. * / 가상 void UnregisterComponent (엔티티 * 엔티티, 구성 요소 * 구성 요소);
    RegisterComponent, UnregisterComponent는 장면의 엔티티에있는 구성 요소를 추가하거나 삭제할 때 장면의 모든 시스템에 대해 호출됩니다.
    또한 편의를 위해 두 가지 더 많은 기능이 있습니다.

    / ** \\ 간략한이 함수는 엔티티가 모두 필요한 구성 요소가있는 경우에만 호출됩니다. \\ param 엔티티 엔티티를 추가하려고합니다. * / 가상 무효 냉증 (엔티티 * 엔티티); / ** \\ 간략한이 함수는 엔티티가 모든 필수 구성 요소를 가졌을 때만 호출되며, \\ param 엔터티 엔터티를 제거하고 싶습니다 (엔티티 * 엔티티).
    이러한 기능은 정렬 된 구성 요소 집합이 SetRequiredComponents 기능을 사용하여 이미 작성된 경우 호출됩니다.

    예를 들어, action_component 및 sound_component가있는 엔티티 만 얻을 수 있습니다. 나는 그것을 setRequiredComponents와 - voila로 옮긴다.

    그것이 어떻게 작동하는지 이해하기 위해, 나는 우리가 가지고있는 시스템에서 예제를 작성합니다 :

    • transformsystem - 변환 계층 구조를 담당하는 시스템입니다.
    • SwitchSystem은 파괴되고 특이한 것과 같은 여러 상태에있을 수있는 객체를 전환 할 책임이있는 시스템입니다.
    • LodSystem은 거리에서 오두막을 전환 할 책임이있는 시스템입니다.
    • ParticleEffectSystem은 입자 효과를 업데이트하는 시스템입니다.
    • RenderUpdateSystem - 장면 수에서 렌더링 객체를 업데이트하는 시스템입니다.
    • LightUpdateSystem은 장면 수에서 광원을 업데이트하는 시스템입니다.
    • ActionUpdateSystem은 작업 (작업)을 업데이트하는 시스템입니다.
    • SoundUpdateSystem은 소리, 위치 및 방향을 업데이트하는 시스템입니다.
    • UpdateSystem - 사용자 정의 사용자 지정 업데이트를 일으키는 시스템입니다.
    • staticocclusionsystem - 정적 폐색 시스템.
    • staticocclusionbuildsystem - 정적 폐색 건설 시스템.
    • SpeedTreeUpdateSystem - 속도 트리 트리 업데이트 시스템.
    • windsystem - 바람 계산 시스템.
    • WAVESYSTEM은 혐의로 진동을 계산하는 시스템입니다.
    • Folliagesystem은 풍경을 통해 식물을 계산하는 시스템입니다.
    우리가 달성 한 가장 중요한 결과는 이질적인 것들을 담당하는 코드의 높은 분해입니다. 이제 Transformsystem :: 프로세스 기능에서 전체 코드가 명확하게 현지화되어 변환과 관련이 있습니다. 그것은 매우 간단합니다. 여러 코어에서 분해하는 것이 쉽습니다. 그리고 가장 중요한 것은 다른 시스템에서 무언가를 깨는 것이 어렵고 변환 시스템에서 논리적 인 변화를 일으키는 것이 어렵습니다.

    거의 모든 시스템에서 코드는 다음과 같습니다.

    (특정 객체 세트) (// 필요한 구성 요소 // 이러한 개체에 대한 작업을 수행 // 데이터를 구성 요소로 쓰십시오)
    시스템을 처리하는 것으로 시스템을 분류 할 수 있습니다.

    • 시스템에있는 모든 객체의 처리가 필요합니다.
      • 물리학
      • 콜리시아
    • 표시된 객체 만 필요합니다.
      • 변환 시스템
      • 작업 시스템 (작업)
      • 사운드 처리 시스템
      • 입자 가공 시스템
    • 특별히 최적화 된 데이터 구조로 작업하십시오.
      • 정적 폐색 시스템
    이 접근 방식을 통해 여러 핵으로 물체를 다루기가 매우 쉽기 때문에 일반적인 다형성 패러다임에서 매우 어려울 수 있습니다. 예를 들어 프레임 당 모든 LOD 스위칭을 쉽게 수행하고 처리 할 수 \u200b\u200b있습니다. 물체가 큰 것에 매우 크면 열린 세계각 프레임이 예를 들어 오브젝트의 3 분의 1로 처리되도록 할 수 있습니다. 이 경우 이것은 다른 시스템에 영향을주지 않습니다.

    결과

    • 우리는 부품 접근법을 갖춘이므로 FPS를 크게 제기하므로 상황이 더욱 독립적이되었고 별도로 착탈하고 최적화 할 수있었습니다.
    • 아키텍처가 더 간단하고 이해할 수 있습니다.
    • 인접 시스템을 파괴하지 않고 거의 엔진을 확장하는 것이 쉽습니다.
    • 그것은 "로그로 뭔가를했는지, 브로크 스위치", 그 반대의 버그로부터 버그보다 적은 것입니다.
    • 여러 핵에 평행 한 모든 기회가있었습니다.
    • 현재 우리는 이미 사용 가능한 모든 커널에서 실행되도록 모든 시스템에서 작업하고 있습니다.
    우리 엔진의 코드는 오픈 소스에 있습니다. 탱크의 세계에서 사용되는 형태의 엔진 Blitz,