JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

[DirectInput] "Input-Ruckeln"

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
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

BeitragVerfasst am: 23.05.2005, 22:37    Titel: [DirectInput] "Input-Ruckeln" Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
FH
Super JLI'ler


Alter: 36
Anmeldedatum: 16.10.2004
Beiträge: 438

Medaillen: Keine

BeitragVerfasst am: 24.05.2005, 06:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
HomeLess_PunkDrummer
JLI Master Trainee


Alter: 36
Anmeldedatum: 28.11.2004
Beiträge: 583
Wohnort: Alter Joghurtbecher an der A4
Medaillen: Keine

BeitragVerfasst am: 24.05.2005, 09:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 24.05.2005, 09:14    Titel: Antworten mit Zitat

HomeLess_PunkDrummer
Thema Mouse stand nicht zur Debatte sondern mehr Tastatur.
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
HomeLess_PunkDrummer
JLI Master Trainee


Alter: 36
Anmeldedatum: 28.11.2004
Beiträge: 583
Wohnort: Alter Joghurtbecher an der A4
Medaillen: Keine

BeitragVerfasst am: 24.05.2005, 09:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 24.05.2005, 09:24    Titel: Antworten mit Zitat

HomeLess_PunkDrummer
Jap, selbes Ergebnis
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 24.05.2005, 10:21    Titel: Antworten mit Zitat

Du hast ja echt alles menschenmögliche ausprobiert. Wink
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 24.05.2005, 14:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
HomeLess_PunkDrummer
JLI Master Trainee


Alter: 36
Anmeldedatum: 28.11.2004
Beiträge: 583
Wohnort: Alter Joghurtbecher an der A4
Medaillen: Keine

BeitragVerfasst am: 25.05.2005, 07:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 25.05.2005, 10:10    Titel: Antworten mit Zitat

Wie sieht's aus? GIbt es schon Neuigkeiten zu dem Problem.
Ich kann dir mal meine DInput Klasse schicken, zum Ruckel-Vergleich...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Dragon
Super JLI'ler


Alter: 38
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 25.05.2005, 15:19    Titel: Antworten mit Zitat

gib uns mal ne demo, die zeigt, wo es ruckelt
vlt. noch mit quelltext, wenn es möglich ist Wink
_________________
Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 29.05.2005, 13:43    Titel: Antworten mit Zitat

Hat sich erledigt, lag am Casting!

Dragon
Du Patrick-Code-Geiler, Du Very Happy

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL 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