|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
hmarcel Mini JLI'ler
Anmeldedatum: 06.12.2006 Beiträge: 2
Medaillen: Keine
|
Verfasst am: 06.12.2006, 14:47 Titel: Verzögerte Tastatureingabe |
|
|
Hallo,
mein Spiel verarbeitet Tastatureingaben mit Direct Input 8.1 abgesehen von den Standard WindowsMessages.
Nun habe ich folgendes Problem: bereits kurz nach Spielbeginn ist es so, dass Tastatureingaben 'wie gespeichert werden' und dann verzögert dem Spiel übergeben wird, ziemlich unangenehm für den Spieler.
Die dinput Klasse ist eigentlich analog zum Buch, auch die Windowsmessageabfrage ist Standard.
Woran könnte das Problem liegen? Irritierend ist auch, dass das Programm im Prozessmanager ca. 95% Rechenzeit braucht, auch wenn es im Hintergrund ist.
Für Hinweise bin ich sehr dankbar.
Marcello |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 06.12.2006, 15:16 Titel: |
|
|
Hmm, kannst du mal etwas Code zeigen?
Vor allem die Benutzung der DirectInput-Klasse und die Hauptnachrichtenschleife _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
hmarcel Mini JLI'ler
Anmeldedatum: 06.12.2006 Beiträge: 2
Medaillen: Keine
|
Verfasst am: 06.12.2006, 15:35 Titel: |
|
|
CPP: | // GameLoop:
while(msg.message != WM_QUIT
&& GetGlobalGameState() != _GlobalGameStateQuit
&& GetGlobalGameState() != _GlobalGameStateDemoQuit) {
if(u_CD3DObjekt::GetExemplar()->lpD3DDevice != 0) {
HRESULT hResult = u_CD3DObjekt::GetExemplar()->lpD3DDevice->TestCooperativeLevel();
if(hResult == D3DERR_DEVICELOST) {
_PRG_PAUSE = true;
}
else
_PRG_PAUSE = false;
}
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
u_CD3DObjekt::GetExemplar()->Begin();
switch(GetGlobalGameState()) {
// ...MoveGame mit Inputabfragen wie
if(pPlayer->GetLeftKey(Input) && !pPlayer->GetRightKey(Input)
&& (pPlayer->KeyUpAgain || pPlayer->InputCounter == 0)
[...]
pPlayer->InputCounter = 20 //alle 20 Frames
pPlayer->KeyUpAgain = false; //wird Key gelesen oder
} //Taste wurde vorher losgelassen
//Bildfrequenz fest 60Hz
u_CD3DObjekt::GetExemplar()->End();
}
[...]
|
Edit by AFE-GmdG:
Ich hab das ganze mal mit Codeflags versehen... |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 06.12.2006, 16:09 Titel: |
|
|
Wegen der Prozessorlast im Background/Pausemodus:
Lege den Thread, wenn er im Pausemodus ist pro Frame 100 Millisekunden schlafen.
Wegen der "InputPufferung"
Ich kann auf Anhieb nichts erkennen, was diese Pufferung verursacht.
Wegen Objekt::GetExemplar():
Verwende, wenn möglich eine Referenz und rufe diese Funktion nur einmal pro Schleife pro Objekt auf
HTH AFE-GmdG
PS.: Verwende BBCode, um Code darzustellen {cpp} und {/cpp} (Eckige Klammern statt der geschweiften) _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 06.12.2006, 19:07 Titel: |
|
|
Hmm, ich weiß jetzt zwar nicht, ob das die Ursache ist, aber ich kenne die Hauptnachrichtenschleife etwas anders:
CPP: | while(true)
{
//Überprüfen, ob eine Nachricht vorliegt
if(PeekMessage(&msg ,NULL,0,0,PM_REMOVE))
{
//Wenn das Programm beendet werden soll, HNSchleife verlassem
if(msg.message==WM_QUIT) break;
// Nachricht an die Callbackfunktion senden
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
//Whatever...
}
} |
Der vllt. entscheidende Unterschied ist, dass dein Gamecode nur abgearbeitet wird, wenn keine Windowsmessage vorliegt. Ich könnte mir vorstellen, dass das zu Konflikten führen kann, wenn zig Nachrichten abgehandelt werden müssen, während du schon die Inputs abfragst. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 07.12.2006, 07:48 Titel: |
|
|
Stimmt, ist mir gar nicht aufgefallen:
In deinem Code oben verarbeitest du nur genau eine WindowsMessage je Frame. Aber alleine wenn du die Maus bewegst, entstehen mehr Nachrichten als du mit deiner Methode abarbeitest - daher die verzögerung.
Also: Erst alle Nachrichten die vorliegen verarbeiten, dann einmal Rendern, dann wieder alle vorliegenden Nachrichten abarbeiten! _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|