Optimizing collision registry

This commit is contained in:
bernatx 2023-04-26 14:46:38 +02:00 committed by bernat
parent 102eb3f0c7
commit 2c1242fcd9
1 changed files with 22 additions and 9 deletions

View File

@ -45,18 +45,31 @@ void ACollisionSensor::OnCollisionEvent(
FVector NormalImpulse,
const FHitResult &Hit)
{
if ((Actor == nullptr) || (OtherActor == nullptr)){
if (Actor == nullptr || OtherActor == nullptr)
{
return;
}
uint64_t CurrentFrame = FCarlaEngine::GetFrameCounter();
auto CollisionRegistry_ = CollisionRegistry;
for (auto & Collision: CollisionRegistry_){
if (std::get<0>(Collision) < CurrentFrame){
auto Index = std::find(CollisionRegistry.begin(), CollisionRegistry.end(), Collision);
CollisionRegistry.erase(Index);
}
else if ((std::get<0>(Collision) == CurrentFrame) && (std::get<1>(Collision) == Actor) && (std::get<2>(Collision) == OtherActor)){
// remove all items from previous frames
CollisionRegistry.erase(
std::remove_if(
CollisionRegistry.begin(),
CollisionRegistry.end(),
[CurrentFrame](std::tuple<uint64_t, AActor*, AActor*> Item)
{
return std::get<0>(Item) < CurrentFrame;
}),
CollisionRegistry.end());
// check if this collision has been procesed already in this frame
for (auto& Collision: CollisionRegistry)
{
if (std::get<0>(Collision) == CurrentFrame &&
std::get<1>(Collision) == Actor &&
std::get<2>(Collision) == OtherActor)
{
return;
}
}
@ -74,5 +87,5 @@ void ACollisionSensor::OnCollisionEvent(
Episode.GetRecorder()->AddCollision(Actor, OtherActor);
}
CollisionRegistry.push_back(std::make_tuple(CurrentFrame, Actor, OtherActor));
CollisionRegistry.emplace_back(CurrentFrame, Actor, OtherActor);
}