Hej
Har fått ett tips om att använda API funktionerna
QueryPerformanceCounter
QueryPerformanceFrequency
för att mäta tid.
Hur jag skall anropa dem och använda dem vej jag ej.
Skulle vilja ha hjälp med att implementera dessa
funktioner i min källkod.
Tack på förhand.
Micael
Skapa en LARGE_INTEGER och peka till den när du anropar till någon av funktionerna eftersom enda parametern är en peka till LARGE_INTEGER.
Inte för att jag förstår varför du vill anropa funktionerna. Om du vill mäta tid kan du använda GetTickCount som är betydligt enklare. Vad är det för tid du vill mäta?
Tack för ditt svar. Men hur skapar jag en Large-Integer?
Jag har tittat lite på denna funktionshantering i VB och C språk.
I båda språken delar man upp variabeln i två delar och i VB kontrollerar man om den minst signifikanta delen av variabeln är negativ.
Är osäker på hur jag skall gå tillväga med variabeluppdelningen och även hur jag skall typa en Large_integer.
Dessa funktioner skall jag använda för precitionsmätning av inkommande pulser.
Med andra ord precitionstidbas.
Föreslår att du använder en vanlig double som variabel.
Följande exempel har ett formulär med en vanlig knapp på bara och visar antalet millisekunder som gått sedan programmet startade, glöm inte att lägga till eventen.
Fungerar inte med .Quadpart i Delphi5 så jag vet inte var du fått det ifrån. Möjligt nånting som försvann till D5, hur nu en vanlig Int64 kan ha några särskillda propertys...?
Hur ofta behövs sån nogrannhet i tidsmätningar. millisekunder räcker ju långt för 3d-spel. Där är det viktigare att själva funktionen som mäter är snabbare.
Som jag skrev var koden för Delphi 3.
I D3 finns inte int64 utan man kan använda TLargeInteger, som inte har några propeties utan är ett record(som du kan hitta i windows uniten). Int64 kom väl i D4.
Orkar inte leta efter info om hur stor skillnaden är mellan QueryPerformanceCounter och GetTickCount är. Men har för mig att GetTickCount noggranhet kan skiftar mellan +-10ms ibland upp till 55 ms.
Tror knappast man använder GetTickCount i proffisionela spel, någon som vet hur man brukar göra?.
Sedan frågades det efter hur QPC skulle implementeras.
Nu kan det ju vara ganska svårt att få bra noggranhet i windows av helt andra skäl
Kolla i dokumentationen kring DirectX så ser du att GetTickCount används flitigt. Nogrannheten är inte +-10ms utan +-0,5ms då den bara ger antalet millisekunder mellan anropen.
Men du har rätt i att frågan gällde QPC och därför är det säkert nog tjatat om vilket sätt som är bäst. QPC har betydligt bättre nogrannhet men tar processorn längre tid att räkna fram så vill man ha snabba svar (vanligt i snabba applikationer som t.ex. spel) är QPC för långsamt.
Kollade i koden för TLargeInteger (i Delphi5) och den pekar numera bara på en vanlig int64, antar att den finns kvar för att vara någorlunda bakåtkompatibel även om jag blev förvånad att D5 inte kunde kompilera D3 kod (brukar vara tvärtom).
Vet inte om jag tänker rätt men kör du denna kod så verkar inte noggranheten vara +-0,5ms.
På min dator varierar resultatet från 3 - 20 ms. Kanske ett tanke fel (iden till koden kom från MS sidor).
Håller med, kul att det finns flera här i Delphi tråden som kan nånting och verkar vara vettigt folk
I mitt Tetris spel (finns på www.winne.net) använder jag, precis som alla andra källkoder över spel jag sett, GetTickCount för att hålla ordning på sakerna i main loopen.
Här är ett urklipp ur den:
//////////////////////////////////////////////////////////////////////////
// WinMain, Initialization, message loop
///////////////////////////////////////////////////////////////////////////
Var aMSG : MSG;
i : integer;
KEYBOARD_DOWN: boolean;
Begin
If InitApp(GetModuleHandle(nil), SW_SHOW) <> DD_OK then Exit;
thisTickCount := GetTickCount;
lastTickCount := ThisTickCount;
[Snip]
While True do
Begin
If PeekMessage(aMsg, 0, 0, 0, PM_NOREMOVE) then
Begin
If not GetMessage(aMsg, 0, 0, 0) then Exit;
TranslateMessage(aMsg);
DispatchMessage(aMsg);
End
Else If (g_bActive) then
Begin
thisTickCount := GetTickCount;
If Mode=GAMEMODE Then
Begin
if (thisTickCount - lastTickCount ) \> TIMER_RATE Then
Begin
lastTickCount := ThisTickCount;
If Check_Collision(test,0,20) Then
begin
Konvert;
\[Snip\]
UpdateFrame;
End;
End
Else
Begin
WaitMessage;
End;
End;
End.
Tror inte att om inte GetTickCount skulle varit noggrann att det fungerat bra i spel då det i så fall hade varit hackit eller i alla fall oregelbundet.
Då övergången till Exclusive DirectX mode ger bättre kontroll över processorn
(windows stör inte så mycket) så fungerar GetTickCount utmärkt. När man kör ditt exempel i windows så kan ju windows själv ibland få för sig att göra andra saker mitt i körningen och därför ge olika resultat hela tiden.
Men detta är nog den enda delphi tråd på WF som jag lärt mig något från.
"
The GetCurrentTime() and GetTickCount() functions are identical. Each returns the
number of milliseconds (+/- 55 milliseconds) since the user started Windows, and the
return value of each function is declared to be a DWORD.
" http://support.microsoft.com/support/kb/articles/Q45/7/02.ASP
Hmmm, måste helt enkelt vara så att det är annorlunda när man kör i DirectX mode då. Med sådan dålig noggrannhet skulle nog inte mitt spel fungera så värst bra...
Ladda hem och testa det, vetja...
(www.winne.net)
Jag e riktigt nöjd med det :)
Det går ju alltid att lägga in DX7 även på en såpass gammal dator. Tänk på om du kör det på jobb att DX7 inte finns till NT4 (det vanligaste jobb-OSet) och därför funkar inte heller mitt spel för NT4. Mycket Nöje... :)
ps. jag vet att det blev stort, c:a 9MB, men musiken är en MP3 låt som jag ville behålla i bra kvalité så då var det värt det... Och innan ni börjar (an)klaga på att låten är riktig med en visserligen relativt okänd artist (för mig iaf) så är det en kraftigt re-mixad version gjord av en polare och det gör det faktiskt hur lagligt som helst. :)
Hej.
Tack allesammans för era inlägg. Jag lyckades lösa problemet med QueryPerformanse som tidsmätare. Använder mig av INT64 variabel.Denna tidsmätning skall inte vara till spel utan mätning av frekvens in på parallellporten. Detta för styr & reglerändamål. Funktionen GetTickCount är ej tillräcklig för denna mätning. Frågan är om funktionen QueryPerformanse
tillsammans med Win9x har tillräcklig precision. Har provat med polling vilket ej givit tillfredställande resultat. Håller på att lära mig assembler och därmed kunna använda mig utav hårvaruinterupts.
268 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849