我正在为路径规划/防撞方法构建一个自上而下的视图演示。 Visual Studio 2010中的c ++。
当我在调试模式下运行时,一切都很好。但是当我在Release中运行时,会发生疯狂的行为。以前我的角色会在遇到其他角色时不断加速并改变方向,现在它们只是消失(可能会移动到屏幕外的某个地方)。
搜索显示这通常是因为浮点运算。我删除了所有浮点数,浮点模型已经在fp上:对于Debug和Release都是精确的。我不知道从哪里开始...
我很确定这段代码是错误的来源。每个字符都可以在单元格中找到。在单元格边缘,存储字符的平均速度(单元格> vLeft等),并且该字符想要将其自身的速度与存储在单元格边缘上的速度进行平均。
void CharacterQueryStructure_Grid::computeActualVelocity(Character& character, double dt){
// find the cell for this character
const CellCoord& cellID = _posToCell2D(character.getPosition());
int x = cellID.first, y = cellID.second;
int layerID = character.getLayer();
if(x == -1 && y == -1){ // if the position is invalid, return no neighbours
//TODO: ERRORRRR
//return Point(NULL, NULL);
character.setNewVelocity_EulerIntegration(character.getPreferredVelocity(), dt);
}
else{
//Interpolate between the four points to find the average velocity at that location
UIC_cell* cell = uicGrids[layerID][_getCellID(x,y)];
double distLeft = (character.getPosition().x - xMin) - cellSize * x;
double distBot = (character.getPosition().y - yMin) - cellSize * y;
//First find the interpolated velocity at the location of your projection on the horizontal and vertical axes.
Point vHor = cell->vLeft * ((cellSize - distLeft)/cellSize) + cell->vRight * (distLeft/cellSize);
Point vVer = cell->vBot * ((cellSize - distBot)/cellSize) + cell->vTop * (distBot/cellSize);
//Now interpolate these to your location
double distHor = abs(distLeft - .5 * cellSize);
double distVer = abs(distBot - .5 * cellSize);
//Point vAverage = vHor * (distHor / (.5 * cellSize)) + vVer * (distVer / (.5 * cellSize));
Point vAverage = (vHor + vVer) / 2;
//Calculate the new velocity based on your own preferred velocity, the average velocity and the density in your cell.
Point newVelo = character.getPreferredVelocity() + (cell->density / maxDensity) * (vAverage - character.getPreferredVelocity());
// set it, while adhering smoothness constraints
character.setPreferredVelocity(newVelo);
}
}
非常感谢任何帮助!
编辑:这是_posToCell2D ......
CellCoord CharacterQueryStructure_Grid::_posToCell2D(const Point& pos) const
{
int x = (int)floor((pos.x - xMin) / cellSize);
int y = (int)floor((pos.y - yMin) / cellSize);
// if this coordinate lies outside the grid: return nothing
if(x < 0 || y < 0 || x >= xNrCells || y >= yNrCells)
return CellCoord(-1,-1);
// otherwise, return the correct cell ID
return CellCoord(x,y);
}
答案 0 :(得分:2)
切换时的一个常见故障是未初始化变量的行为。你有没有把所有的uicGrids [] []设置成一些初始值?
通常,Debug会自动将这些初始值设置为0。发布会使用以前使用的剩余ram留下它们。
答案 1 :(得分:1)
如果上述猜测都没有帮助,那么调试这种方法的有效方法是临时添加大量日志语句并写入日志文件,以便跟踪代码执行并查看变量值。