C++ 性能问题、堆栈、堆还是原型模式?
我正在编写一个小游戏,想擦亮我的C++,因此我使用我能找到的所有花哨的设计模式;p> 所以现在我假设我使用了错误的模式,因为我有严重的性能问题 我为我的敌人类使用原型模式,然后克隆不同的敌人,必须绘制和更新…所以…我想根据他们的距离给每个阿尔法添加一些子元素。。。。所以所有人都是敌人,我想我通过循环我的敌人向量来搜索每个次要的最近的阿尔法敌人。首先是一个小调,如果我有一个小调,我会通过再次循环for循环来检查alpha类型来寻找最近的alphaC++ 性能问题、堆栈、堆还是原型模式?,c++,design-patterns,prototype,C++,Design Patterns,Prototype,我正在编写一个小游戏,想擦亮我的C++,因此我使用我能找到的所有花哨的设计模式;p> 所以现在我假设我使用了错误的模式,因为我有严重的性能问题 我为我的敌人类使用原型模式,然后克隆不同的敌人,必须绘制和更新…所以…我想根据他们的距离给每个阿尔法添加一些子元素。。。。所以所有人都是敌人,我想我通过循环我的敌人向量来搜索每个次要的最近的阿尔法敌人。首先是一个小调,如果我有一个小调,我会通过再次循环for循环来检查alpha类型来寻找最近的alpha class Enemy { public:
class Enemy
{
public:
virtual ~Enemy() {};
virtual Enemy* clone() = 0;
...
virtual void draw();
...
void update(std::vector<Enemy*>& enemies);
类敌人
{
公众:
虚拟~敌人(){};
虚拟敌人*克隆()=0;
...
虚空绘制();
...
无效更新(标准::向量和敌人);
而且
void Enemy::update(std::vector<Enemy*>& enemies) {
Enemy* closestAlpha = nullptr;
for (int i = 0; i < enemies.size(); i++) {
if (enemies[i]->getType() == eType::MINOR) {
//Find the closest alpha
closestAlpha = getNearestAlpha(enemies);
// If we found a alpha, move towards him and join him
if (closestAlpha != nullptr) {
// Get the direction vector twoards the alpha
}
}
}
}
Enemy* Enemy::getNearestAlpha(std::vector<Enemy*>& enemies) {
Enemy* closestAlpha = nullptr;
float smallestDistance = 9999999.0f;
for (int i = 0; i < enemies.size(); i++) {
}
}
void敌人::更新(标准::向量和敌人){
敌人*closestAlpha=nullptr;
for(int i=0;igetType()==eType::MINOR){
//找到最近的阿尔法
closestAlpha=getNearestAlpha(敌人);
//如果我们找到阿尔法,向他走去,加入他
如果(关闭状态!=nullptr){
//得到阿尔法方向向量
}
}
}
}
而且
void Enemy::update(std::vector<Enemy*>& enemies) {
Enemy* closestAlpha = nullptr;
for (int i = 0; i < enemies.size(); i++) {
if (enemies[i]->getType() == eType::MINOR) {
//Find the closest alpha
closestAlpha = getNearestAlpha(enemies);
// If we found a alpha, move towards him and join him
if (closestAlpha != nullptr) {
// Get the direction vector twoards the alpha
}
}
}
}
Enemy* Enemy::getNearestAlpha(std::vector<Enemy*>& enemies) {
Enemy* closestAlpha = nullptr;
float smallestDistance = 9999999.0f;
for (int i = 0; i < enemies.size(); i++) {
}
}
敌方*敌方::getNearestAlpha(std::矢量和敌方){
敌人*closestAlpha=nullptr;
浮动最小距离=999999.0f;
for(int i=0;i通过使用释放模式而不是调试来解决…现在计算超过1000个对象考虑创建一个单独的类来容纳和过滤敌人
// Just cause I can't be bothered to write std::vector.... all the time.
typedef std::vector<Enemy*>* enemyVector;
class AllEnemies
{
public:
...
// Checks Enemy's type and adds it to apropriate vector;
void addEnemy(Enemy* e);
enemyVector getMinors()
enemyVector getAlphas()
...
private:
enemyVector m_minors;
enemyVector m_alphas;
};
//只是因为我不能一直费心去写std::vector。
typedef std::vector*enemyVector;
阶级同盟
{
公众:
...
//检查敌人的类型并将其添加到适当的向量中;
无效的敌人(敌人*e);
enemyVector
enemyVector getAlphas()
...
私人:
灌肠媒介m_未成年人;
enemyVector m_alphas;
};
您还应该考虑更改数据模型。在处理此类问题时,通常会使用某种空间分区。
检查并您正在迭代
敌人
并比较类型,然后再次迭代所有敌人
,这似乎非常昂贵。什么是Alpha?这是一种类型吗?如果是这样,您应该先过滤向量,您需要解释更多您尝试的内容可能很昂贵,但它只是一个for循环?我有两种类型敌人,未成年人和阿尔法,我想附加每个阿尔法一些未成年人取决于他们之间的距离…所以所有人都是敌人我想我搜索每个未成年人最近的阿尔法敌人通过循环我的敌人向量。如果你不喜欢猜游戏,使用剖析器。这不仅仅是一个for循环。这是一本教科书O(N^2)算法。如果你担心性能,也许可以避免。看在上帝的份上,profile.profiler说std::vector::operator[]和std::vector::size占用了整个更新函数的大部分时间。。。