C++ 面向数据的碰撞检测

C++ 面向数据的碰撞检测,c++,cpu,data-oriented-design,C++,Cpu,Data Oriented Design,我试图从面向数据的角度进行碰撞检测。我想在检测到碰撞后移除敌人,但不确定如何使CPU尽可能优化,现在我这样做: bool EnemyManager::isCollidedWithBullet(float x, float y, int& numEnemies){ for(auto it = positions.begin(); it != positions.end(); ++it){ // Collision detected if(x >

我试图从面向数据的角度进行碰撞检测。我想在检测到碰撞后移除敌人,但不确定如何使CPU尽可能优化,现在我这样做:

bool EnemyManager::isCollidedWithBullet(float x, float y, int& numEnemies){
    for(auto it = positions.begin(); it != positions.end(); ++it){

        // Collision detected
        if(x > it->first && x < it->first+enemyWidth && y < it->second + enemyHeight){
            positions.erase(it);
            numEnemies = positions.size();
            return true;
        }

    }
    return false;
}
bool-EnemyManager::isCollidedWithBullet(浮点x、浮点y、int和numEnemies){
用于(自动it=位置。开始();it!=位置。结束();+it){
//检测到碰撞
如果(x>it->first&&xfirst+enemyWidth&&ysecond+enemyHeight){
位置。擦除(它);
numEnemies=positions.size();
返回true;
}
}
返回false;
}

像我现在做的那样,立即从向量中移除integerpair可以吗,或者我应该以某种方式将所有“检测到的”碰撞存储在另一个向量中并从那里继续?我是一个以数据为导向的新手,如果有任何帮助,我将不胜感激。

您的程序在评估一帧中的碰撞检测时会执行多少次比较?听起来你在做
O(n^2)
比较(假设
isCollidedWithBullet
是为世界上所有活动的实体调用的)-如果是这样,那就没有效率了。只要bullet是活动的(我一次只有一个bullet),我每帧调用一次这个函数。所有敌人的所有位置都存储在类型pair的向量位置中。那么,由于只有一个“检测到的”碰撞,您存储所有“检测到的”碰撞到底是什么意思(当您检测到碰撞后返回时)?这里有一个O(n)线性搜索和O(n)删除,所以不会让事情变得更糟。不过,如果你有很多“敌人”,你可以尝试使用kd tree之类的工具来获得更好的性能。你的程序在一帧中执行多少次比较来评估碰撞检测?听起来你在做
O(n^2)
比较(假设
isCollidedWithBullet
是为世界上所有活动的实体调用的)-如果是这样,那就没有效率了。只要bullet是活动的(我一次只有一个bullet),我每帧调用一次这个函数。所有敌人的所有位置都存储在类型pair的向量位置中。那么,由于只有一个“检测到的”碰撞,您存储所有“检测到的”碰撞到底是什么意思(当您检测到碰撞后返回时)?这里有一个O(n)线性搜索和O(n)删除,所以不会让事情变得更糟。不过,如果你有很多“敌人”,你可以尝试使用kd tree之类的工具来获得更好的性能。