我正在将handmadehero.org项目中的C代码翻译成Delphi代码。我遇到了一个特定部分的性能问题:
原件:
inline real32
Win32GetSecondsElapsed(LARGE_INTEGER Start, LARGE_INTEGER End)
{
real32 Result = ((real32)(End.QuadPart - Start.QuadPart) /
(real32)GlobalPerfCountFrequency);
return(Result);
}
我的版本:
function Win32GetSecondsElapsed(Start, &End : LARGE_INTEGER): real32; inline;
begin
Result := (&End.QuadPart - Start.QuadPart) / GlobalPerfCountFrequency;
end;
调用sleep函数后,会有这段代码确保我们达到目标帧速率:
SleepMilliSeconds = <some code that calcs how long to wait to hit target frame rate>
Sleep(SleepMilliSeconds);
real32 TestSecondsElapsedForFrame = Win32GetSecondsElapsed(LastCounter, Win32GetWallClock());
Assert(TestSecondsElapsedForFrame < TargetSecondsPerFrame);
如果我使用相同的代码(只是它是Delphi版本),我会收到一个断言错误。
如果我将代码更改为:
TestSecondsElapsedForFrame := ((LastCounter.QuadPart - Win32GetWallClock().QuadPart) / GlobalPerfCountFrequency);
Assert(TestSecondsElapsedForFrame < TargetSecondsPerFrame);
错误消失了,因此在Delphi中对函数的调用需要足够长的时间才能让我超过允许睡眠完成的时间。 有谁知道我怎么解决这个问题? 我已经尝试更改Win32GetSecondsElapsed中的参数作为指针传递,但它没有帮助。 我认为这可能是因为它是通过价值传递而需要制作副本,但事实并非如此。 我认为'内联'指令没有生效。
我认为Delphi应用程序应该可以像C应用程序一样快。
答案 0 :(得分:1)
此函数调用不会导致任何性能问题 - 问题与代码完全不同。
您将Win32GetWallClock()
传递为End
,LastCounter
传递为Start
,因此该功能正确计算
Win32GetWallClock().QuadPart - LastCounter.QuadPart
但内联版本计算
LastCounter.QuadPart - Win32GetWallClock().QuadPart
为零或负数。