2016-04-13 3 views
0

Ich versuche, ein Spiel zu erzeugen, das ein Labyrinth enthält, das zufällig für jedes Niveau erzeugt wird. Ich entwerfe dieses Spiel für Android und verwende openGL 1.Strategie für das Rendern der gleichen Sprites viele Male ohne zu verlangsamen FPS

FPS ist um 60, wenn ich ziemlich kleine Labyrinthe laufe, aber wenn ich anfange, hoch in Zahlen zu gehen, fällt der FPS auf 30s-40s. Ich zeichne jede Wand als ein separates Sprite (mit einem Standard-SpriteBatcher ich kam aus dem Internet, und die gleiche Textur) und FPS fällt, wenn die Anzahl der Sprites ist 500 oder mehr. FPS scheint nicht weiter nach unten zu gehen, wenn ich bis zu 3000 Sprites bekam, aber beim Zoomen geht es wieder auf ~ 60. Also dachte ich, dass die Anzahl der Sprites, die angezeigt werden müssen, der Grund für das ist langsamer.

Meine anfängliche Strategie war, das Labyrinth bei der Initiation zu zeichnen und es dann als ein Sprite darzustellen. Allerdings werde ich gelegentlich Änderungen im Spiel im Labyrinth vornehmen, so dass diese Zeichnung während der Spielzeit aufgerufen wird und ziemlich schnell sein muss. Ich habe versucht, die Pixel aus dem Display zu packen und habe versucht, das Labyrinth mit Canvas im Hintergrund zu zeichnen, aber beide Methoden benötigen etwa 1 volle Sekunde.

Ich werde jede Idee, wie man das umgehen kann, und jeden Gedanken darüber, warum das Spiel langsamer wird, wenn meine Hypothese falsch ist, schätzen.

Danke

Haftungsausschluss - Ich bin nicht ein sehr erfahrener Programmierer.

+0

Sie Ihr Spiel in Android Studio Programmierung sind? Unwirklich? Einheit? – fix

+0

Nein, ich schreibe in Eclipse und habe den gesamten Wrapper-Code geschrieben (mit Hilfe des Internets) – Tacratis

Antwort

0

Ich habe nicht viel Erfahrung in Android-System oder OpenGL ES.

Aber in OpenGL eine bessere Leistung haben Sie eine minimale tun sollten:

  1. Verschiedene Bindung (Puffer, Texturen, ...)
  2. Verwenden Sie nicht viel Zeichenaufruf (batching ist die beste)

nicht mehr Puffer zu binden, zu tun haben, ist der bessere Weg, eine und nur ein „große“ vbo zu verwenden, die Sie zu Beginn des Rendering gebunden. Für die Texturen gibt es viel Weg. Da Sie auf OpenGL 1 abzielen, sollte der beste Weg sein, ein großes Textur-Array zu verwenden.

Um eine Stapelverarbeitung durchzuführen, sollten (und müssen) Sie glMultiDrawElements (oder Array verwenden, aber Elemente werden für das Caching bevorzugt).

Also, für Ihr Problem werde ich versuchen, eine Menge Dinge selbst zu tun. Sie können keine spärlichen bindeless Texturen verwenden (und es sollte die bessere Lösung für Sie sein), aber Sie können texture array verwenden (wenn es in der Version verfügbar ist, auf die Sie zielen, bin ich mir nicht sicher).

Wenn Sie Textur Array nicht verwenden können, können Sie eine und nur eine große Textur zuweisen, und setzen Sie eine Menge Sprites, zum Beispiel könnten Sie 20 oder 30 Sprites setzen, passen Sie die UVs in den Folgen. Nach , führen Sie eine Schleife von glDrawMultiElements :).

In Pseudo-Code, sollte Ihr machen Schleife wie diese

for each batch of (say 30 sprites) 
    glBindTexture(); 
    glMultiDrawElements(); // maybe 300 commands (if a sprite is used for 10 walls) 
end for 
sein
+0

Eigentlich rufe ich den Draw-Befehl nur einmal an, und ich benutze eine einzelne Textur. Ich bin auch kein Experte, also Teil von dem, was Sie erwähnen, ich bin nicht 100% sicher, aber ich denke, dass mein Dosierer alles tut, was Sie erwähnen. Ich habe jedoch heute bemerkt, dass manchmal das Herauszoomen auch hilft, also beginne ich zu denken, dass die Verlangsamung auf das Mischschema zurückzuführen ist, und dass es sehr empfindlich auf die genaue Pixelposition reagiert, wenn die Sprite-Größen geändert werden. Ich werde versuchen, die Mischung zu entfernen, um zu sehen – Tacratis

Verwandte Themen