Ich habe mein Spiel auf das Beispiel des Lunarlanders gestützt und stottere Probleme, seit ich angefangen habe es zu machen. Nichts, was ich versucht habe, hat sie losgeworden, also bin ich an den Punkt gekommen, wo ich ein paar Stunden damit verbracht habe, eine abgespeckte Version des Lunarländer-Beispiels zu erstellen, und ein einfaches Scrolling-Bild eingefügt habe, um das Stottern zu zeigen. HINWEIS: Es bezieht sich nicht auf den Garbage Collector. Wenn Sie denken, dass es ist, schauen Sie sich einfach das Protokoll an, der Garbage Collector läuft nirgends so oft wie das Stottern erscheint.
Das Bild, das den Bildschirm nach unten scrollt, stottert ungefähr jede Sekunde für ungefähr eine Zehntelsekunde auf meinem Telefon (Motorola Milestone, 2.2). Diese Art von Stottern zerstört das Gameplay nicht genau, aber es ist sehr störend und frustrierend. Mein Spiel beinhaltet auch eine Menge schnelles Scrollen und schnelle Bewegungen, daher ist es im Allgemeinen dort offensichtlich.
Wenn einer von euch die Zeit hat, könntest du dir dieses Eclipse-Projekt ansehen und sehen, ob:
Ich hoffe, dass ich einfach eine verzögerte Codezeile habe, die diese ganze Sache verursacht, ohne dass ich es merke. Ich kann einfach nicht glauben, dass selbst nach dem Entfernen so viel hat es immer noch die gleiche Menge an Stottern als mein komplettes Spiel mit 1000 Objekten, vor allem, da es auf meinem Handy mit einer festen 60fps läuft.
EDIT: Habe mein Spiel auf Traceview profiliert, es scheint in Ordnung.
Download-Link zur Quelle: Ссылка
Ich habe es auf meinem Handy (nexus one) versucht, es war das gleiche für mich.
Ich habe ein paar Änderungen vorgenommen, die es für mich besser gemacht haben:
Anstatt jedesmal während der Schleife neue Variablen zu deklarieren, deklarierte ich die as-Eigenschaften der Klasse
Leinwand c = null; // wird
private Leinwand c;
// In der Schleife benutze jetzt einfach
c = null
Machen Sie dies für alle Variablen, die Sie immer wieder deklarieren, in den Funktionen doDraw und updatePhysics.
anstatt die Ansicht zu erhöhen, bis für immer, ich habe nur ein wenig wenn statmant
if (viewY & gt; mCanvasHeight) {
%Vor%}
Ich bin mir nicht sicher, ob es jetzt 100% funktioniert, aber scheint mir viel besser.
Es klingt, als ob Ihr Scrollen viel Müll erzeugt, der häufig gesammelt werden muss. Wenn Sie viele kurzfristige kleine Objekte erstellen, sollten Sie Ihren eigenen Pool verwalten. Solange Sie nicht zulassen, dass der Pool ohne Grenzen wächst, kann dies den GC vor dem Timing stark einschränken.
Ich habe es auf einem Verizon DroidX (2.2.1) getestet und es sieht aus wie alle 3-6 Sekunden und sehr kurz. Es scheint etwas besser mit dem aktiven Hintergrund aus und nichts anderes läuft. Vielleicht kann das Grafik-Subsystem einfach nicht mithalten? Haben Sie ein weniger grafikintensives Bild (weniger Pixel und weniger Farben) probiert, nur um zu sehen, was es macht?
Sie zeichnen pro Bild drei riesige Hintergrund-Bitmaps ... das ist mehr Arbeit als nötig. Es kann besser sein, ein BitmapShader
zu verwenden, wenn TileMode auf Wiederholen eingestellt ist. Dann ist es nur ein Anruf in die native Schicht.
Fügen Sie ein Paint paint;
-Member irgendwo hinzu und ändern Sie Ihre setSurfaceSize()
so, dass sie die folgenden Zeilen enthält:
Dann muss doDraw()
nur das sein:
Ich habe das nicht gemessen, um beweisen es ist schneller, aber was ich über Grafik-APIs weiß, sollte es sicherlich sein.
(Wenn Sie wirklich fliegen wollen, sollten Sie OpenGL ES benutzen ...)