FPS künstlich heruntersetzen

  • Guten Abend! :)


    Bin an einem Spiel dran, bei dem so ziemlich alles mit Canvas gezeichnet wird (und mit nem Thread alles wiederholt wird). Jetzt kämpfe ich teilweise mit leichten laggs auf meinem sgs2 (meistens am anfang des spieles). Damit das Ganze entlastet wird, möchte ich die FPS auf etwa 45 drosseln, den speed und alles andere dafür natürlich anpassen. Das sollte laggs verhindern und dennoch flüssig aussehen.


    Auch würde ich es nicht auf 45 heruntersetzen und dennoch das Laggproblem beseitigen, bräuchte ich hierfür eine Lösung, denn: Die App funktioniert auf dem Handy meiner Freundin mit "stolzen" 80 fps (Samsung Galaxy Ace +). Das kann ich mir jedoch nicht erklären, denn auf meinen zwei anderen Testhandys laufen die FPS nicht wirklich über 60 hinaus.


    Da es bei dem Spiel teilweise auch um schnelles Geschick geht, wären Leute mit Handys mit 80 fps benachteiligt, da eben alles schneller abläuft (sieht auch nicht so schön aus wenn sich alles so schnell bewegt)


    Eine weitere Frage welche sich aufgrund der startlaggs ergibt: Wie kann man eine gewisse Ladezeit einbinden und prüfen, wann die App fertig geladen hat, wie es bei etlichen Spielen der Fall ist?


    Vielen Dank für eure Antworten! :)


    MFG

  • Zuerst einmal erwähnt: Ich kenne mich mit Spieleprogrammierung nicht wirklich gut aus, aber ich versuche mal das wiederzugeben, was ich so bisher gesehen hab :P


    Zu 1: Um die FPS zu begrenzen, legst du deinen Thread, in dem dein Gameloop läuft, für eine gewisse Zeit schlafen. Bei 45FPS würden das ca. 20ms sein.

    Java
    try {
       Thread.sleep(20);
    } catch (InterruptedException e) { // Exception-Handling }


    Zu 2: Diese Loading-Screens sind ja dafür da, um benötigte Bilder, Musik, ect. in den Speicher zu laden, damit dies nicht erst während des spiels gemacht werden muss. Am einfachsten wäre es wohl eine Activity zu erstellen (mit ProgressBar usw.) die einen AsyncTask startet. Dieser lädt alles was benötigt wird und sorgt durch die onPostExecute() (die ja aufgerufen wird, sobald der AsyncTask seine Arbeit erledigt hat, dass die Activity zum eigentlichen Spiel gewechselt wird.


    So oder so ähnlich würde ich vorgehen, aber wie gesagt, ich habe nicht viel Erfahrung bei sowas.


    block_

  • Irgendwie kenne ich nur Tutorials für Mac OS X und Objective-C.
    Könnte daran liegen, dass ich das länger mache. ;)


    Jedenfalls kannst du dir da gegebenenfalls was abschauen:
    Space Invaders
    Worm-X


    Beide Tutorials sprechen meiner Erinnerung nach das Thema FPS-Bremse an.


    Und ebenfalls für den Mac ist mir ein (mittlerweile) kostenloses eBook bekannt:
    Pangea Software's Ultimate Game Programming Guide for Mac OS X


    (Ich hab noch die gedruckte Fassung im Regal stehen...)


    Hilft dir vermutlich nur bedingt, da die ganzen Dinge auf OpenGL und C/Objective-C basieren, doch vielleicht kannst du da ja das ein oder andere adaptieren. :)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Danke für die Antworten :)


    Das mit den FPS hab ich jetzt etwas mehr unter Kontrolle und kann es momentan auch bei 60 FPS belassen.
    War von der Performance-Sache bestimmt nicht klug bei etwa 50 Objekten je Level mit der selben Grafik jedem Objekt eine extra Bitmap zuzuschreiben, diese dort extra abzuspeichern und nach jeden mal drawn lassen :P Habe es jetzt so umgestaltet dass ich Bitmaps nur noch sehr sparsam verteile, so werden es in meinem Fall z.B. von 50 gespeicherten Bitmaps (auch wenn das Bild an sich nur 2kb hat ^^) auf nur eine heruntergesetzt :P


    Dennoch hab ich wegen manchen "überflieger" handys eine künstliche FPS bremse eingebaut, die bei 16ms sekunden liegt... mal sehen, ich hoffe, dass es auch klappt :P


    Wegen dem Async Task werd ich mich auch demnächst mal ransetzen, soweit die Startlaggs erneut aufkommen :P


    Aber dennoch bleibt mir ein Rätsel, warum manche Handys mit 80 FPS laufen? Ich dachte mir immer, dass alle Handys standardmäßig auf 60 gedrosselt sind...

  • Wie sollten sie das machen?
    Das Betriebssystem kann niemals wissen, welche Aufgaben deines Programms wofür da sind und dementsprechend auch nicht eingreifen.
    Die Framerate hängt immer von dem implementierten Programm ab und es ist auch einzig die Aufgabe dieses Programms, die Framerate gegebenenfalls zu regulieren.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Naja das ist nur halb korrekt, dein gameloop kann schon schneller als die 60x pro sekunde iterieren, allerdings (je nach dem wie du zeichnetst, opengl? Surfaceview? OnPaint? ) wirst du nicht öfter deine view zeichnen können als das OS es dir erlaubt, deshalb das 60fps limit.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!