この条件にバグがあります:
while(CurrentObserverPathPointDisplacement > lengthToNextPoint && CurrentObserverPathPointIndex < (PathSize - 1) )
{
CurrentObserverPathPointIndex = CurrentObserverPathPointIndex + 1;
CurrentObserverPathPointDisplacement -= lengthToNextPoint;
lengthToNextPoint = (CurrentObserverPath->pathPoints[min((PathSize - 1),CurrentObserverPathPointIndex + 1)] - CurrentObserverPath->pathPoints[CurrentObserverPathPointIndex]).length();
}
リリース モード中に無限ループに陥ったようです。デバッグモードでは正常に動作しますが、最後の行にデバッグ出力を配置すると、より興味深いものになります
OutputInDebug("Here");
条件自体の生成されたアセンブリを次に示します。
while(CurrentObserverPathPointDisplacement > lengthToNextPoint && CurrentObserverPathPointIndex < (PathSize - 1) )
00F074CF fcom qword ptr [dist]
00F074D2 fnstsw ax
00F074D4 test ah,5
00F074D7 jp ModelViewData::moveCameraAndCenterOnXYPlaneForwardBackward+27Eh (0F0753Eh)
00F074D9 mov eax,dword ptr [dontRotate]
00F074DC cmp eax,ebx
00F074DE jge ModelViewData::moveCameraAndCenterOnXYPlaneForwardBackward+27Eh (0F0753Eh)
{
2 番目の条件では、bool 型の関数パラメーターである「dontRotate」の値を eax に移動し、それと比較しているように見えますが、dontRotate はそのコードの近くでは使用されていません。
これが少し小さなデータかもしれないことは理解していますが、個人的には明らかなコンパイラ エラーのように思えます。しかし悲しいことに、実際にバグレポートを作成するのに十分な自己完結型の問題にそれを抽出する方法がわかりません。
編集:実際の減速ではなく、タイプ:
double CurrentObserverPathPointDisplacement;
double lengthToNextPoint;
int CurrentObserverPathPointIndex;
int PathSize;
vector<vector3<double>> CurrentObserverPath::pathPoints;
編集2:
while の最後に debug print ステートメントを追加すると、これは生成されるアセンブリであり、もはやバグを表現していません。
while(CurrentObserverPathPointDisplacement > lengthToNextPoint && CurrentObserverPathPointIndex < (PathSize - 1) )
00B1751E fcom qword ptr [esi+208h]
00B17524 fnstsw ax
00B17526 test ah,5
00B17529 jp ModelViewData::moveCameraAndCenterOnXYPlaneForwardBackward+2D6h (0B175A6h)
00B1752B mov eax,dword ptr [esi+200h]
00B17531 cmp eax,ebx
00B17533 jge ModelViewData::moveCameraAndCenterOnXYPlaneForwardBackward+2D6h (0B175A6h)
{