약간의 배경 지식으로, 엔터티 시스템에 ENTT를 사용하여 C ++에서 친구와 함께 진화 게임 을 코딩하고 있습니다. 생물은 2D지도에서 걸어 다니고, 녹색이나 다른 생물을 먹고, 번식하고 그 특성을 변화시킵니다.
또한 게임이 실시간으로 실행될 때 성능은 양호하지만 (60fps 문제 없음) 중요한 변경 사항을보기 위해 4 시간을 기다리지 않아도 속도를 크게 높일 수 있기를 원합니다. 그래서 나는 가능한 빨리 그것을 얻고 싶다.
생물체가 음식을 찾는 효율적인 방법을 찾기 위해 고심하고 있습니다. 각 생물은 그들에게 가장 가까운 최고의 음식을 찾아야합니다.
먹기를 원한다면, 중앙에 묘사 된 생물체는 149.64 반경 (시거리)에서 주변을 둘러보고 영양, 거리, 유형 (고기 또는 식물)을 기준으로 어떤 음식을 추구해야하는지 판단해야합니다. .
그들의 음식이 런타임의 약 70 %를 먹는 모든 생물을 찾는 책임이있는 기능. 현재 작성된 방식을 단순화하면 다음과 같습니다.
for (creature : all_creatures)
{
for (food : all_entities_with_food_value)
{
// if the food is within the creatures view and it's
// the best food found yet, it becomes the best food
}
// set the best food as the target for creature
// make the creature chase it (change its state)
}
이 기능은 음식을 찾고 상태를 바꿀 때까지 음식을 찾는 모든 생물에 대해 모든 진드기를 실행합니다. 또한 특정 음식을 이미 쫓고있는 생물을 위해 새로운 음식이 생성 될 때마다 모든 사람이 이용할 수있는 최고의 음식을 찾도록합니다.
이 프로세스를보다 효율적으로 만드는 방법에 대한 아이디어에 열려 있습니다. 나는 O ( N 2 ) 에서 복잡성을 줄이고 싶습니다. 그것이 가능한지 모르겠습니다.
내가 이미 그것을 향상시키는 한 가지 방법은 all_entities_with_food_value
그룹 생물이 먹을 수 없을 정도로 큰 음식을 반복 할 때 거기서 멈추는 것입니다. 다른 개선 사항은 환영합니다.
편집 : 답장을 보내 주셔서 감사합니다! 다양한 답변에서 다양한 것을 구현했습니다.
나는 유죄 기능이 5 틱마다 한 번 씩만 실행되도록 처음으로 간단하게 만들었습니다. 이로 인해 게임에 대해 아무것도 변경하지 않으면 서 게임이 약 4 배 빨라졌습니다.
그 후 나는 음식 검색 시스템에 음식과 같은 진드기가 생성 된 배열을 저장했습니다. 이 방법으로 나는 생물이 쫓고있는 음식과 나타난 새로운 음식을 비교하기 만하면됩니다.
마지막으로, 공간 분할에 대한 연구와 BVH 및 쿼드 트리를 고려한 후, 나는 그것이 더 간단하고 내 경우에 더 적합하다고 생각하기 때문에 후자와 함께 갔다. 나는 그것을 매우 빨리 구현하고 성능을 크게 향상 시켰습니다. 음식 검색은 거의 시간이 걸리지 않습니다!
이제 렌더링이 속도를 늦추고 있지만 다른 날에는 문제가됩니다. 모두 감사합니다!
if (food.x>creature.x+149.64 or food.x<creature.x-149.64) continue;
성능이 충분한 경우 "복잡한"스토리지 구조를 구현하는 것보다 추가 가 쉬워야합니다. (관련 : 내부 루프에 코드를 조금 더 게시하면 도움이 될 수 있습니다)