ECS? 실제로 인터페이스 디자인에 영향을 줄 수 있기 때문에 디자인의 데이터 지향적 인 측면에 많은 생각을하고 다른 담당자를 벤치마킹하는 것이 조기에 그렇지 않을 수 있다고 제안합니다 . 게임. 또한 ECS는 많은 작업과 선결제를 요구하며, 그 시점을 활용하여 디자인 수준의 성능 슬픔을 줄이려고하지 않는지 확인하기 위해 그 시간을 활용할 가치가 있다고 생각합니다. 전체 괴물 엔진. 이 부분은 나에게 눈부신 :
unordered_map<string,[yada]>
작은 문자열 최적화를 사용하더라도 다른 가변 크기 컨테이너 (unorder_maps) 내에 가변 크기 컨테이너 (문자열)가 있습니다. 테이블은 매우 희박한 경우 작은 문자열의 최적화가 해시 테이블의 각 사용되지 않는 인덱스는 여전히합니다 (SS 최적화를 위해 더 많은 메모리를 사용하는 것을 의미하는 것이기 때문에 사실, 작은 문자열 최적화 실제로,이 경우에 도움이 유해로 수 sizeof(string)
것 해시 테이블의 총 메모리 오버 헤드가 저장하는 것보다 비용이 많이 드는 지점, 특히 위치 구성 요소와 같은 간단한 구성 요소 인 경우 큰 보폭으로 더 많은 캐시 미스가 발생하는 경우 해시 테이블의 한 항목에서 다음 항목으로 이동합니다.
문자열이 구성 요소 ID와 같은 일종의 키라고 가정합니다. 그렇다면 이미 비용을 크게 절감 할 수 있습니다.
unordered_map<int,[yada]>
... 예를 들어, 스크립터가 사용할 수있는 사용자에게 친숙한 이름을 가질 수있는 이점을 원한다면, 인터 닝 된 문자열을 사용하면 두 가지 이점을 모두 얻을 수 있습니다.
즉, 문자열을 합리적으로 낮은 범위의 밀도가 높은 인덱스에 매핑 할 수 있다면 다음과 같이 할 수 있습니다.
vector<[yada]> // the index and key become one and the same
내가이 조기를 고려하지 않은 이유는 다시 인터페이스 디자인에 영향을 줄 수 있기 때문입니다. DOD의 요점은 한 번에 IMO에서 상상할 수있는 가장 효율적인 데이터 표현을 제시하려고 시도해서는 안되며 (일반적으로 필요에 따라 반복적으로 달성해야 함),이를 처리하기 위해 인터페이스를 설계 할 수있을 정도로 충분히 생각해야합니다. 계단식 설계 변경없이 프로파일 링하고 최적화 할 수있는 충분한 호흡 공간을 제공하는 데이터.
순진한 예로서, 모든 코드를 이것에 결합하는 비디오 처리 소프트웨어 :
// Abstract pixel that could be concretely represented by
// RGB, BGR, RGBA, BGRA, 1-bit channels, 8-bit channels,
// 16-bit channels, 32-bit channels, grayscale, monochrome,
// etc. pixels.
class IPixel
{
public:
virtual ~IPixel() {}
...
};
단일 픽셀 수준 에서 추상화하는 아이디어 vptr
는 이미지 수준 에서 추상화하는 것보다 이미 비효율적입니다 ( 자체적으로 전체 픽셀보다 더 많은 메모리를 소비 할 수 있음). 종종 수백만 픽셀을 나타냅니다). 따라서 이러한 악몽 시나리오에 직면 할 필요가없고 이상적으로는 더 이상 필요하지 않도록 데이터 표현에 대해 충분히 생각하십시오. 그러나 여기서는 이러한 것들에 대해 생각하지 않아도됩니다. ECS 주변에 복잡한 엔진을 설치하고 ECS 자체가 설계 수준에서 사물을 변경해야하는 방식으로 병목 현상을 발견합니다.
ECS 캐시 미스에 관해서는 개발자들은 종종 ECS를 캐시 친화적으로 만들기 위해 너무 열심히 노력합니다. 벅이 모든 구성 요소에 완벽하게 인접한 방식으로 액세스하려고 시도하기에는 너무 적은 비용이 들기 시작하며 종종 모든 곳에서 데이터를 복사하고 섞는 것을 의미합니다. 일반적으로 메모리 영역을 캐시 라인에로드하지 않고 제거하기 만하면로드 할 수있는 방법으로 액세스하기 전에 기수 정렬 구성 요소 인덱스에 액세스하는 것이 좋습니다. 동일한 캐시 라인의 다른 부분에 액세스하기 위해 동일한 루프에서 다시 반복됩니다. ECS는 전반적으로 놀라운 효율성을 제공 할 필요가 없습니다. 물리학이나 렌더링 시스템만큼이나 입력 시스템의 이점과는 다르므로 "좋은"목표를 세우는 것이 좋습니다 보드 전체의 효율성과 실제로 필요한 곳에 "우수"합니다. 즉, 사용unordered_map
그리고 string
여기서 피할 수있을 정도로 쉽습니다.