我正在將handmadehero.org項目的C代碼翻譯成Delphi代碼。我遇到了一個性能問題在一段特定的:調用函數的速度Delphi vs C++
原文:
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;
調用休眠功能後有這個代碼,以確保我們打目標幀率:
SleepMilliSeconds = <some code that calcs how long to wait to hit target frame rate>
Sleep(SleepMilliSeconds);
real32 TestSecondsElapsedForFrame = Win32GetSecondsElapsed(LastCounter, Win32GetWallClock());
Assert(TestSecondsElapsedForFrame < TargetSecondsPerFrame);
如果我使用相同的代碼(只有它是德爾福版本),我g等一個斷言錯誤。
如果我更改代碼這樣:
TestSecondsElapsedForFrame := ((LastCounter.QuadPart - Win32GetWallClock().QuadPart)/GlobalPerfCountFrequency);
Assert(TestSecondsElapsedForFrame < TargetSecondsPerFrame);
錯誤消失,因此呼叫Delphi中的功能需要足夠長的時間來把我推在允許的睡眠完成的時間。 有誰知道我該如何解決這個問題? 我已經嘗試更改Win32GetSecondsElapsed中的參數作爲指針傳遞,但它沒有幫助。 我認爲這可能是因爲它被價值傳遞,需要複製一份,但事實並非如此。 我認爲'inline'指令沒有生效。
我相信Delphi應用程序應該可以像C應用程序一樣快。
調用一個函數不應該花費太多時間,但大概在這種情況下會出現問題。你必須檢查生成的代碼來確定什麼/爲什麼。 – 2015-02-08 09:46:56
請注意,在這種情況下「調用函數」並不重要。既然「endtime」在兩種情況下都被當作一個論點! – 2015-02-08 09:57:14
我不認爲在遊戲應用程序中入睡是明智的。每次應用程序到達計算/繪製下一幀的點時,它都應該計算自上次調用後應計算的幀數。然後計算所有這些,只畫最後一個。有時它只是一個NOP調用,有時你必須計算一些幀,這取決於當前的系統狀態。 – 2015-02-08 13:53:49