Сильно запаздывающее обнаружение ограничивающего прямоугольника
У меня есть ограничительная система обнаружения столкновений для основной игры. Каждый раз, когда я появляюсь в сущности, с ней соединяется ограничительная рамка. Система столкновения сама работает; однако это чрезвычайно запаздывает даже для двух организаций. Мой код указан ниже, я знаю, что это определенно не самый эффективный способ сделать это, но я действительно не знаю, как это сделать другим способом.
bbX, bbY и bbZ - это позиция AABB в мире.
float radX1,radX2;
float radY1,radY2;
float radZ1,radZ2;
float arr[12];
radX1 = (bb->maxX - bb->minX) / 2;
radX2 = (this->maxX - this->minX) / 2;
radY1 = (bb->maxY - bb->minY) / 2;
radY2 = (this->maxY - this->minY) / 2;
radZ1 = (bb->maxZ - bb->minZ) / 2;
radZ2 = (this->maxZ - this->minZ) / 2;
arr[1] = bb->bbX - 0.5f - radX1;
arr[2] = bb->bbX - 0.5f + radX1;
arr[3] = bb->bbY - 0.5f - radY1;
arr[4] = bb->bbY - 0.5f + radY1;
arr[5] = bb->bbZ - 0.5f - radZ1;
arr[6] = bb->bbZ - 0.5f + radZ1;
//this coords
arr[7] = this->bbX - 0.5f - radX2;
arr[8] = this->bbX - 0.5f + radX2;
arr[9] = this->bbY - 0.5f - radY2;
arr[10] = this->bbY - 0.5f + radY2;
arr[11] = this->bbZ - 0.5f - radZ2;
arr[12] = this->bbZ - 0.5f + radZ2;
if(arr[2] >= arr[7] && arr[1] <= arr[8])
{
if(arr[4] >= arr[9] && arr[3] <= arr[10])
{
if(arr[6] >= arr[11] && arr[5] <= arr[12])
{
this->collided = TRUE;
OutputDebugStringA("Collided!\n");
return TRUE;
}
}
}
Эта функция вызывается по таймеру примерно каждые 15 мс, но увеличение числа итераций также не сильно помогло.
Функция, которая выполняет работу по сравнению существующих ограничивающих рамок:aabbPool - это список, в котором хранятся все загруженные в данный момент AABB.
for(auto i = this->aabbPool.begin();i < this->aabbPool.end();++i)
{
OutputDebugStringA("Called!\n");
if(*i == NULL) ;
else
{
exe = *i;
for(auto k = this->aabbPool.begin();k < this->aabbPool.end();++k)
{
comp = *k;
if(exe->id == comp->id) ;
else
{
if(exe->isCollidedWith(comp)) OutputDebugStringA("Collided!\n");
}
}
}
}