|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 23.05.2005, 22:37 Titel: [DirectInput] "Input-Ruckeln" |
|
|
Hi,
eines vorab: JA, ich weiß, es ist CrossPosting, aber nach mehreren Wochen Fehlersuche und regelrecht mit dem Doku-Latein am Ende sein, gönne ich mir das Ausnahmsweise mal!
ich stehe vor einem interessanten Problem bei dem ich jedoch selbst mit der Doku nicht mehr weiter komme:
Ich habe eine DirectInput-Klasse geschrieben für Tastatur und Maus, nichts großartiges also. Jedoch habe ich dort ständig eine Art Input-Ruckeln. Was bei der Grafikausgabe zu wenig FPS sind, habe ich hier mit dem Input, trotz optimaler FPS von 240.
Zur Erstellung: Ich habe die DirectInput Devices folgendermaßen erstellt:
CPP: | // TASTATUR____________________________________________
// Tastaturobjekt erstellen
if (directInput8_->CreateDevice (::GUID_SysKeyboard, &keyboard_, NULL) != DI_OK)
EXCEPTION ("IDirectInput8::CreateDevice(); failed! (Keyboard)");
// Format setzen
if (keyboard_->SetDataFormat (&c_dfDIKeyboard) != DI_OK)
EXCEPTION ("IDirectInputDevice8::SetDataFormat(); failed! (Keyboard)");
// Kooperativen level setzen
if (keyboard_->SetCooperativeLevel (hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE) != DI_OK)
EXCEPTION ("IDirectInputDevice8::SetCooperativeLevel(); failed! (Keyboard)");
// Capabilities abfragen für die Tastatur
if (keyboard_->GetCapabilities (&caps) != DI_OK)
EXCEPTION ("IDirectInputDevice8::GetCapabilities(); failed! (Keyboard)");
// Teste ob Tastatur überhaupt angeschlossen ist!
if (!(caps.dwFlags & DIDC_ATTACHED))
EXCEPTION ("Keyboard is currently not attached!");
// Tastatur aktivieren
if (keyboard_->Acquire () != DI_OK)
EXCEPTION ("IDirectInputDevice8::Acquire(); failed! (Keyboard)");
// MOUSE_______________________________________________
// Tastaturobjekt erstellen
if (directInput8_->CreateDevice (::GUID_SysMouse, &mouse_, NULL) != DI_OK)
EXCEPTION ("IDirectInput8::CreateDevice(); failed! (Mouse)");
// Format setzen
if (mouse_->SetDataFormat (&c_dfDIMouse2) != DI_OK)
EXCEPTION ("IDirectInputDevice8::SetDataFormat(); failed! (Mouse)");
// Kooperativen level setzen
if (mouse_->SetCooperativeLevel (hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE) != DI_OK)
EXCEPTION ("IDirectInputDevice8::SetCooperativeLevel(); failed! (Mouse)");
// Capabilities abfragen für die Maus
if (mouse_->GetCapabilities (&caps) != DI_OK)
EXCEPTION ("IDirectInputDevice8::GetCapabilities(); failed! (Mouse)");
// Teste ob Maus überhaupt angeschlossen ist!
if (!(caps.dwFlags & DIDC_ATTACHED))
EXCEPTION ("Mouse is currently not attached!");
// Maus aktivieren
if (mouse_->Acquire () != DI_OK)
EXCEPTION ("IDirectInputDevice8::Acquire(); failed! (Mouse)"); |
Funktioniert einwandfrei, lässt sich wunderbar erstellen. Jedoch egal was ich daran verändere (Thema: Flags) das ruckeln geht nicht fort!
Also dachte ich es würde mit dem Updaten zusammen hängen, dass dort zuviel Zeit verschwendet wird, jedoch dort war auch nichts! Und die Profilerergebnisse ergaben das er dort wie Butter durchgeht.
Hier trotzdem mal der Code: CPP: | // Haben wir den Fokus für die Eingabe?
if ((keyboard_->Acquire() == DIERR_OTHERAPPHASPRIO) ||
(mouse_->Acquire () == DIERR_OTHERAPPHASPRIO))
{
// Nein, also alles auf Default setzen.
for (unsigned long i=0; i<256; ++i)
currKey_[i] = oldKey_[i] = false;
// Maus auf default setzen.
::ZeroMemory (&oldMouseState_, sizeof (::DIMOUSESTATE2));
::ZeroMemory (&currMouseState_, sizeof (::DIMOUSESTATE2));
// Funktion beenden!
return;
}
// TASTATUR____________________________________________
// Aus neu mach alt:
for (unsigned long i=0; i<256; ++i)
oldKey_[i] = currKey_[i];
// Status der Tasten abfragen und speichern
if((retval = keyboard_->GetDeviceState (sizeof(bool)*256, (void*)&currKey_)) != DI_OK)
{
DEBUG_STACK;
// Fokus verloren?
if (retval == DIERR_INPUTLOST)
{
// Versuchen Fokus wieder zu holen
keyboard_->Acquire ();
// Status der Tasten abfragen und speichern
if (keyboard_->GetDeviceState (sizeof(bool)*256, (void*)&currKey_) != DI_OK)
EXCEPTION ("IDirectInputDevice8::GetDeviceState(); failed! (Keyboard)");
}
else
EXCEPTION ("IDirectInputDevice8::GetDeviceState(); failed! Invalid params. (Keyboard)");
}
// MOUSE_______________________________________________
// Aus neu mach alt:
::CopyMemory (&oldMouseState_, &currMouseState_, sizeof (::DIMOUSESTATE2));
// Status der Tasten abfragen und speichern
if((retval = mouse_->GetDeviceState (sizeof(::DIMOUSESTATE2), (void*)&currMouseState_)) != DI_OK)
{
DEBUG_STACK;
// Fokus verloren?
if (retval == DIERR_INPUTLOST)
{
// Versuchen Fokus wieder zu holen
mouse_->Acquire ();
// Status der Tasten abfragen und speichern
if (mouse_->GetDeviceState (sizeof(::DIMOUSESTATE2), (void*)&currMouseState_) != DI_OK)
EXCEPTION ("IDirectInputDevice8::GetDeviceState(); failed! (Mouse)");
}
else
EXCEPTION ("IDirectInputDevice8::GetDeviceState(); failed! Invalid params. (Mouse)");
} |
Und ich weiß wirklich nicht mehr woran es liegen könnte? Ich benutze in der Hauptschleife ebenfalls PeekMessage statt GetMessage.
Ich dachte auch das es evtl. bei meiner Direct3D Anwendung lag, jedoch bei anderen Anwendungen mit anderen GrafikAPIs wie z.B. OpenGL oder DirectDraw das selbe Ergebnis! Auch die Timer für die neuen Positionierungen der Darstellungs-Objekte habe ich ausgewechselt und alle waren in Ordnung. (Getestet mit Profiler und anderen InputAPIs darunter auch die Fensternachrichten Methode)
Selbst in der Dokumentation und in deren Tutorials stand zu diesem Vorfall nichts (der auch bei anderen Auftritt, denen ich die Testprogramme gebe).
Interessanterweise tritt dieser Fehler jedoch extrem stark auf (Man kann nichtmal eine Bitmap mehr per Tastatur bewegen) wenn ich den VSync der Grafik API deaktiviere, lasse ich den VSync an, merkt man es schon aber nicht mehr so extrem stark.
Ich bin für jede konstruktive Theorie offen, die mir bei diesem Problem hilft.
Danke im voraus!
- Patrick
edit: Selbst wenn ich diese if-Abfrage wegen DIERR_OTHERAPPHASPRIO herausnehme, das Problem bleibt bestehen. _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
FH Super JLI'ler
Alter: 36 Anmeldedatum: 16.10.2004 Beiträge: 438
Medaillen: Keine
|
Verfasst am: 24.05.2005, 06:32 Titel: |
|
|
Versuch doch mal, die Mouse oder die Tastatur rauszunehmen, um rauszufinden, an was es liegt.
Gruß
FH _________________ goto work, send your kids to school
follow fashion, act normal
walk on the pavement, watch T.V.
save for your old age, obey the law
Repeat after me: I am free |
|
Nach oben |
|
|
HomeLess_PunkDrummer JLI Master Trainee
Alter: 36 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 24.05.2005, 09:02 Titel: |
|
|
Ha das liegt daran das die Maus nen int zurückgibt. Wenn du sie 10 Pixel pro Sekunde bewegst hast du bei 10 fps einen pro Frame, aber bei 100 fps? 0! Wegen fucking int. Tja, wie man das beheben kann weiß ich nicht. _________________ "Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz." |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
HomeLess_PunkDrummer JLI Master Trainee
Alter: 36 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 24.05.2005, 09:21 Titel: |
|
|
Haste mal DISCL_EXCLUSIVE probiert? _________________ "Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz." |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 24.05.2005, 10:21 Titel: |
|
|
Du hast ja echt alles menschenmögliche ausprobiert.
Mit der Windows-Input-API funktioniert es einwandfrei sagst du?
In der Systemsteurung kann man unter DirectX auch für DirectInput auswählen, ob die Debug Runtime benutzt werden soll. Außerdem kann man dort auch den Debug Output Level festlegen. Vielleicht ist der zu hoch...
Hattest du schonmal Probleme mit DirectInput? Bei anderen Projekten gab es doch kein "Input-Ruckeln".
Hast du den Code damit schon verglichen?
Wie sieht der Code für die Tastenabfrage aus? |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 24.05.2005, 14:49 Titel: |
|
|
KI hat Folgendes geschrieben: | Hattest du schonmal Probleme mit DirectInput? Bei anderen Projekten gab es doch kein "Input-Ruckeln".
Hast du den Code damit schon verglichen?
Wie sieht der Code für die Tastenabfrage aus? |
...und Bleibt das Probelm bei anderen Computern(ich nehm an, du hasts auf der Arbeit shcon prbiert?) bestehen? |
|
Nach oben |
|
|
HomeLess_PunkDrummer JLI Master Trainee
Alter: 36 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 25.05.2005, 07:22 Titel: |
|
|
Kann es sein dass du aus Versehen bei
CPP: | If(Aktiv&&PeekMessage(...))
{
// Message
}
else
{
// Update
}
|
aus Debuggingzwecken so auskommentiert hast:
CPP: | If(Aktiv&&PeekMessage(...))
{
// Message
//}
//else
//{
// Update
} |
Das war nämlich gestern bei mir ein Problem. _________________ "Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz." |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 25.05.2005, 10:10 Titel: |
|
|
Wie sieht's aus? GIbt es schon Neuigkeiten zu dem Problem.
Ich kann dir mal meine DInput Klasse schicken, zum Ruckel-Vergleich... |
|
Nach oben |
|
|
Dragon Super JLI'ler
Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 25.05.2005, 15:19 Titel: |
|
|
gib uns mal ne demo, die zeigt, wo es ruckelt
vlt. noch mit quelltext, wenn es möglich ist _________________ Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 29.05.2005, 13:43 Titel: |
|
|
Hat sich erledigt, lag am Casting!
Dragon
Du Patrick-Code-Geiler, Du
Aber noch panic, wenn meine Site bald online ist gibt diese Klasse zum Download! Oder ich poste sie evtl. heute Abend mal hier im Thread
- Patrick, der nun Ruckelfrei coden kann _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
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
|