Hilfe bei der Zeitmessung
-
Also erstmal Danke für die Antworten.
@davie
Also ich programmiere entweder unter Windows oder Linux.@AndreasW
Also mit deinem Code kann ich leider nichts anfangen, was ist mit der Zeileasm rdtsc;
gemeint, was wird hier gemacht???
Auch was ich mit dem Code machen kann.
Ich habe mal diesen Code geschrieben
void time_control(int MILLI_SEC_INTERVALL) { long time_new = 0, time_old = 0; do { time_old = time_new; time_new = clock(); }while((time_new % MILLI_SEC_INTERVALL) >= (time_old % MILLI_SEC_INTERVALL)); }
Was haltet ihr von der Version???
-
ähm,
rdtsc ist Pseudoassambler (Ein Macro)
#define rdtsc __asm __emit 0fh __asm __emit 031h
der die Bytes direkt an den Output schmeißt.
rdtsc gibs aber nur im VC++ alternative kann man auch _emit bei älteren Compilern benutzen.
Oder:
#pragma inline // für den Borland Compiler //.. __int64 rdtsc(){ asm {dw 310Fh} }
ok,
für den Dev-C++ wenn du den benutzen solltest lieber:
UINT64 rdtsc() { UINT64 tmp; __asm volatile("rdtsc" : "=A" (tmp)); return tmp; }
-
Du solltest aber bedenken, dass weder Windows noch Linux Echtzeitbetriebssysteme sind. Das heißt das OS garantiert dir nicht, dass dein Programm auch läuft wenn die Zeit abgelaufen ist; Stichwort Multitasking.
Im Extremfall kann es sogar vorkommen, dass dein Programm für mehrere Sekunden keine Rechenzeit bekommt. Du darfst dich also nicht auf rdtsc etc. verlassen.
-
genau, weshalb es prinzipell nicht geht eine Durchlaufzeit zu erzwingen.
Du kannst zwar eine ZEit messen. Sogar bis auf die pikosekunde. Du kannst dieses aber nicht beeinflussen.Ein Zählen bis eine DUrchlaufzeit erreicht wurde funtkionert deshalb nicht.
-
@AndreasW
Danke für die Erklärung, aber wie du wohl gemerkt hast habe ich von VC++ und damit von der WinAPI und MFC keine Ahnung. Hatte durch das Abi etc. eine längere Pause vom Programmieren gemacht.Ich will eigentlich nur mal versuchen ein kleines Konsolenspielchen zu schreiben, ich brauche diesen festen ablauf eigentlich nur dazu das das spiel nicht in Lichtgeschwindigkeit läuft, also sozusagen als Bremse.
Wie macht man das Eigentlich Profesionell???
-
Das musst du die Leute im Spieleforum fragen.
Unter Windows nimmt man zum Zeitmessen GetTickCount; für eine Framebremse reicht das dicke aus.
Die andere Möglichkeit ist, die Bewegung nicht von den Frames, sondern von der Zeit abhängig zu machen. Dann kann das Spiel auch mit 1000 fps laufen ohne davonzurasen.
-
Ach so,
dafür ist deine Version vollkommend ausreichend.
die erwähnten Zeitmessungsmethoden sind eigentlich nur zweckmäßig wenn man sehr genaue Zeitdifferenzen braucht.
-
Ok dankeschön, das wollte ich nur wissen
-
#include <conio.h> // getch(), kbhit(), system(...) #include <ctime> // tm, time, time_t, localtime #include <iostream> #include <iomanip> void wait_ms( unsigned t ) // Wartezeit Millisekunden { clock_t start; double zeit; start = clock(); do { zeit = 1000 * ( clock() - start ) / static_cast<float>(CLOCKS_PER_SEC); }while( zeit < t ); } using namespace std; const tm getTime() { const time_t t1 = time(0); const tm * t2 = localtime(&t1); // Zeiger auf Struktur tm return *t2; } int main() { while(!kbhit()) { cout << setw(2) << setfill('0') << getTime().tm_hour << ':' << setw(2) << setfill('0') << getTime().tm_min << ':' << setw(2) << setfill('0') << getTime().tm_sec; wait_ms(1000); system("cls"); } }
-
Und wenn man seine Benutzer nicht unnötig quälen will, kann man auch Sleep(Laenge_in_ms) aus windows.h benutzen.
Zum etwas genaueren Timen als mit GetTickCount bietet sich außerdem timeGetTime() an (winmm.lib mitlinken), die Präzision kann man mit timeBeginPeriod(Genauigkeit_in_ms) und timeEndPeriod(Genauigkeit_in_ms) einstellen. Hatte nie Probleme damit und es ist auch etwas einfacher zu benutzen als QueryPerformanceCounter etc.