JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=2c678a076c223d6475f5d94cfaef7198Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Verzögerte Tastatureingabe

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
hmarcel
Mini JLI'ler



Anmeldedatum: 06.12.2006
Beiträge: 2

Medaillen: Keine

BeitragVerfasst am: 06.12.2006, 14:47    Titel: Verzögerte Tastatureingabe Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 06.12.2006, 15:16    Titel: Antworten mit Zitat

Hmm, kannst du mal etwas Code zeigen?
Vor allem die Benutzung der DirectInput-Klasse und die Hauptnachrichtenschleife Wink
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
hmarcel
Mini JLI'ler



Anmeldedatum: 06.12.2006
Beiträge: 2

Medaillen: Keine

BeitragVerfasst am: 06.12.2006, 15:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 06.12.2006, 16:09    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 06.12.2006, 19:07    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 07.12.2006, 07:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum