Es ruckelt (SDL)



  • Das es am Monitor liegt bezweifle ich, erstens habe ich einen crt und zweitens würde der dann doch nicht so offensichtlich schon im pc länger brauchen.
    Genauso denke ich nicht das da irgendwo ein Überlauf in der Anzeige entsteht, ich mach dafür einfach

    Uint32 now = SDL_GetTicks();
    for(;;)
    {
      if(!make_gameframe())break;
      cout << "framedauer: "<< (SDL_GetTicks()-now)<<std::endl;
      now = SDL_GetTicks();
    }
    

    Also ich habe das Spiel heute nochmal auf den PCs meiner Eltern probiert, auf dem dortigen p500 und p1500 lief es mit 40 bzw 50 fps vollkommen flüssig.

    Setze ich die Priorität auf meinem PC hoch, läuft das Spiel auch etwas flüssiger, die framedaueranzeige sagt mir dazu dann
    "
    19
    38
    37
    19
    .....
    "

    statt
    "
    19
    20
    19
    19
    59
    19
    ..."

    Denke damit ist der Verursacher mehr oder weniger klar, irgendwo läuft bei mir ein Prozess der einmal die Sekunde irgendwelchen Müll macht.
    Die 40ms die er braucht werden bei Prio hoch anscheinend nochmal unterteilt und man lässt das Spiel noch einmal während er rumrechnet ran.

    Hm... jetzt weiss ich aber immer noch nicht wie ich das verhindern kann ^^
    Weder finde ich einen Prozess der sowas machen könnte(auch nachdem Virenscanner usw ausgeschaltet wurde tritt dieser Effekt auf), noch weiss ich wie ich das jetzt programmtechnisch umgehen könnte.

    Ich werd nochmal intensiv Spyware suchen undso... hmm ich frage mich nur warum tritt das dann nicht bei anderen Spielen auf?
    Gibt es ein Tool um sich die Auslastung durch irgendwelche Programme pro ms genau anzeigen lassen zu können?



  • dreaddy schrieb:

    19
    20
    19
    19
    59
    19
    ..."

    Denke damit ist der Verursacher mehr oder weniger klar, irgendwo läuft bei mir ein Prozess der einmal die Sekunde irgendwelchen Müll macht.

    ich hatte mal genau dasselbe problem, dort lags an einem falsch installierten treiber und es wurde mit der falschen GL-lib gelinkt.



  • Hm das mit dem Durchscnitt der letzten 10 framezeiten habe ich jetzt mal probiert, anstatt das es ruckelt macht der Char jetzt einmal die Sekunde eine kleine Pause.

    Ist zwar auch nicht schön, sieht aber wesentlich besser aus, danke für den Tipp.

    Spyware aller Sorten habe ich auch gefunden und gegrillt, das hat aber nichts gebracht.

    Sdl-Libs habe ich auch nomma die neuesten gezogen, hat auch nix gebracht und opengl oder so nutze ich nicht sondern nur sdl mit den ganzen dazugehörigen libs wie mixer, gfx, image usw. und von denen habe ich grad überall die neuesten Versionen gesaugt.
    Grafikkartentreiber habich eigentlich auch vor kurzem erst aktualisiert hmmm... das gefällt mir immer weniger alles =[

    Vielleicht sollte ich mir einfach einen neuen Pc kaufen 🙄



  • Versuch doch mal rauszufinden, wo genau er einmal die Sekunde die zusätzliche Zeit verbrät.



  • hm ich gehe inzwischen eigentlich davon aus das das irgendwo extern ausserhalb des Spieles und damit jedesmal an unterschiedlicher Stelle passiert, aber ich werde das nochmal nachprüfen.



  • hm das ist interessant, das Zeitproblem entsteht genau beim screens flippen hier:

    save_time("vorm flip");   // zeit vorher in Datei speichern 
    SDL_Flip (screen);   <--------------------------------- !!!!!!!!!!!!! =[
    save_time("ende make_gameframe"); // Zeit nachher in Datei speichern
    


  • Ich kenne mich mit SDL nicht so aus, aber wird da V-Sync benutzt?





  • Ich habe erst gelesen, dass SDL sehr implementierungs-abhängig ist. Bei dem Artikel ging es um Hardware Surfaces und so... könnte also auch an so etwas liegen.

    Klingt jedenfalls sehr misteriös... Wenn nicht an deiner Zeitberechnung liegt...

    Mich hat das ganze mit den verschiedenen implementierungen gleich so abgeschreckt, dass ich gleich zu sdl+opengl gegriffen hab. Weiß nicht ob dass viel besser ist, aber wurde auch in dem artikel angeraten.

    Muss dazusagen, dass ich mit opengl auch schon früher eigentlich keine probleme der sorte hatte. (Weiß aber nicht ob dieser umstieg für dich in frage kommt)

    gutes gelingen noch!
    mfg Manuel



  • Naja eigentlich bin ich mit SDL bisher sehr zufrieden, nur das das sdl_flip sich irgendwie synchronisiert und dazu teilweise ewig für braucht is recht zum kotzen ^^
    Ich mein da steht ja auch "The hardware will wait for vertical retrace, and then swap video buffers before the next video surface blit or lock will return" aber so lange?_?

    Das in nen extra SDL-Thread zu packen wirds wohl auch nicht bringen, das Bild muss ja fertig sein und auf allen anderen Rechnern läufts ja hmm.



  • Glaub mir du sparst dir extrem viel Ärger und Zeit, wenn du die Zeichenfunktionen immer in einem Thread lässt.

    Hast du nen Virenscanner im Hintergrund laufen?

    Dass du bei (kommerziellen) Spielen keine Probleme hast kann daran liegen, dass die ihre Prozesspriorität erhöhen (bringt bei dir anscheinend ja auch was).



  • Was soll ich da in einen extra Thread packen?

    Ich kann immer nur dann auf dem Bildschirm darstellen wenn ein Frame fertiggezeichnet ist und das Problem ist ja die zeichnen <-> darstellen Synchronisation anscheinend.
    Aber die sind halt voneinander abhängig.



  • Versuch doch mal in den Treibereinstellungen den vsync auszuschalten.



  • dreaddy schrieb:

    hm das ist interessant, das Zeitproblem entsteht genau beim screens flippen hier:

    save_time("vorm flip");   // zeit vorher in Datei speichern 
    SDL_Flip (screen);   <--------------------------------- !!!!!!!!!!!!! =[
    save_time("ende make_gameframe"); // Zeit nachher in Datei speichern
    

    Sry wenn ich Stuss erzähle, aber nur mal rein interessehalber: dauert das speichern in eine datei nicht extrem lange? Ich dachte immer solche sachen werden direkt in den Arbeitsspeicher geschrieben 😕



  • Kommt drauf an!
    Wenn Du z.B. flush aufrufst, dann wartet er wirklich, bis die Daten geschrieben wurden. Normalerweise werden sie in einen Puffer geschrieben, und wenn der voll ist, wird er auf die Platte geschrieben.



  • hm ok, aber beim nächsten frame werden die Daten denk ich mal ja dann wieder gelesen, bis dahin sind sich doch sicherlich noch nicht auf der hd. Das heist also man kann in den Puffer Daten schreiben und lesen noch bevor die geschriebenen Daten auf der hd gelandet sind. Dann wird so ein Puffer wohl unter anderem dazu verwendet das Programm vor dem völligen Stillstand zu bewahren wenn der ram voll ist. *n00bmäßige Vermutungen anstell* Vielleicht hat er den Puffer zu klein gemacht?



  • vsync deaktivieren bringt nichts, das hatte ich schon mal probeirt, genauso wie so ziemlich an jeder Eisntellung der graka rumzuschrauben.

    An save_time oder irgendwlechen Dateischreib/lesaktionen wirds nicht liegen.
    Die Methode save_time() schreibt nur die aktuelle Zeit in eine Datei mit dem dazugehörigen String zum debuggen, da wird nix gelesen ausser nachher mit dem Editor.
    Und der Effekt war ja auchschon vorher da.



  • Kannst Dir ja mal den SDL Source ziehen, Debug erstellen, und das Problem "weiter innen" debuggen...



  • hm jo, aber nicht kurz vor der Klausurenphase :>


Anmelden zum Antworten