1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Lag bei zu hohen Auflösungen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Tadeus123, 31.12.2011.

  1. Tadeus123, 31.12.2011 #1
    Tadeus123

    Tadeus123 Threadstarter Neuer Benutzer

    Beiträge:
    3
    Erhaltene Danke:
    0
    Registriert seit:
    31.12.2011
    Hi,
    ich habe das Problem, dass bei meinem Kartenspiel (indem auch Karten von A nach B "fliegen") es öfters zu kleineren Lags kommt. Dies passiert aber nur auf Handys/Tablets mit höheren Auflösungen.
    Auf dem HTC Wildfire läuft das Spiel problemlos ohne Ruckler, auf dem Desire gibt es dann schon ein paar Ruckler und auf dem GalaxyTab und Galaxy Nexus ist das ganze dann schon sehr nervig.
    Leider weiss ich absolut nicht, woran es liegen kann. Egal welches Handy die App ausführt, es werden zunächst alle Bilder geladen und skaliert (in Abhängigkeit der Displayauflösung und die Ausgangsbilder sind auf allen Geräten diegleichen). Die skalierten Bilder werden dann als Bitmap-Variable zur Verfügung gestellt und in der onDraw-Methode über den canvas gezeichnet.
    Ich habe auch schon probiert die Skalierung nicht von der Auflösung des Gerätes abhängig zu machen, sondern diese statisch berechnet: Wildfire lief flüssig und Tab bzw. Nexus nicht.

    Woran könnte es also noch liegen, dass es auf Geräten, die eine große Auflösung haben, lagt? Schon einmal Danke für eure Hilfe.
     
  2. wilco, 01.01.2012 #2
    wilco

    wilco Android-Hilfe.de Mitglied

    Beiträge:
    106
    Erhaltene Danke:
    32
    Registriert seit:
    10.08.2010
    Bei Geräten mit hoher Auflösung sind die Grafiken größer, und somit müssen mehr Pixel rumgeschaufelt werden. Meine Apps laufen auf dem Wildfire auch mit einer besseren Bildwiederholrate als auf dem Nexus One, obwohl das Nexus One die bessere Hardware hat.

    Wenn die App dann nicht hundertprozent performant geschrieben ist fällt das bei Geräten mit höherer Auflösung einfach eher auf.

    Die Hauptsache auf die Du für flüssige Spiele achten musst ist die Garbage Collection. Wenn Du z.B. in der onDraw() Methode jedesmal neue Variable instantiierst (eventuell sogar Grafiken), so erzeugst Du hier größere Datenmengen die durch die Garbage Collection wieder aufgeräumt werden müssen. Und jedesmal wenn die läuft steht so ziemlich alles andere, was sich im Spielfluss durch Ruckeln bemerkbar macht.

    Schau einfach mal im Log wie häufig die Garbage Collection läuft während Dein Spiel aktiv ist. Dann siehst Du ob Du da ein Problem hast oder nicht.
     
  3. Tadeus123, 02.01.2012 #3
    Tadeus123

    Tadeus123 Threadstarter Neuer Benutzer

    Beiträge:
    3
    Erhaltene Danke:
    0
    Registriert seit:
    31.12.2011
    Danke für deine Antwort. Tatsächlich habe ich aus Versehen (da ich die onDraw-Methode umgebaut habe) so programmiert, dass in jedem onDraw-Durchgang ca. 30 Instanzen einer Klasse erstellt wurden. Das habe ich nun anders gelöst.

    Jetzt wollte ich das ganze im Debug-Mode laufen lassen und schauen, ob der GarbageCollector zu viel zu tun hat. Auf einmal läuft das Spiel wunderbar flüssig, laut Logcat wird der GC auch nur aufgerufen, wenn der Spieler wechselt und die Verzögerung, die durch den GC auftritt, beläuft auch nur auf 2ms.
    Wenn ich allerdings das Spiel nicht im Debug-Mode laufen lasse, laggt es wieder (nur kann ich da ja leider nicht schauen, wie es mit dem GC aussieht).

    Frage: Was läuft im Debug-Mode anders als im normalen Modus? (vll. mehr Ressourcen oder sowas)

    Edit: Also vermutlich liegt es am begrenzten Ram, der bei normalen Apps 24 MB beträgt und im Debug-Mode 48 MB. Laut Debug-Mode benötigt meine App 25 MB, sodass ständig der GarbageCollector Daten rumschaufeln muss. Ich such also mal, wo der ganze Ramverbrauch herkommt (liegt vermutlich an den Bitmaps, die ich lade, diese müsste ich also irgendwie anders laden, sodass das 24MB-Limit nicht erreicht wird)
     
    Zuletzt bearbeitet: 02.01.2012

Diese Seite empfehlen