Ich entwickle ein Sprite-basiertes 2D-Spiel für mobile Plattformen und verwende OpenGL (eigentlich Irrlicht) zum Rendern von Grafiken. Zuerst habe ich das Sprite-Rendering auf einfache Weise implementiert: Jedes Spielobjekt wird als Quad mit einem eigenen GPU-Draw-Aufruf gerendert. Wenn ich also 200 Spielobjekte hätte, hätte ich 200 Draw-Aufrufe pro Frame durchgeführt. Natürlich war dies eine schlechte Wahl und mein Spiel war vollständig CPU-gebunden, da bei jedem GPU-Draw-Aufruf ein kleiner CPU-Overhead anfällt. Die GPU blieb die meiste Zeit im Leerlauf.
Jetzt dachte ich, ich könnte die Leistung verbessern, indem ich Objekte in großen Stapeln sammle und diese Stapel mit nur wenigen Zeichenaufrufen rendere. Ich habe Batching implementiert (so dass jedes Spielobjekt mit derselben Textur im selben Batch gerendert wird) und dachte, dass meine Probleme weg sind ... nur um herauszufinden, dass meine Framerate noch niedriger war als zuvor.
Warum? Nun, ich habe 200 (oder mehr) Spielobjekte und sie werden 60 Mal pro Sekunde aktualisiert. Für jeden Frame muss ich eine neue Position (Translation und Rotation) für Scheitelpunkte in der CPU neu berechnen (GPU auf mobilen Plattformen unterstützt keine Instanzierung, daher kann ich dies dort nicht tun) und diese Berechnung 48000 pro Sekunde (200 * 60 * 4 seitdem) durchführen Jedes Sprite hat 4 Eckpunkte) scheint einfach zu langsam zu sein.
Was könnte ich tun, um die Leistung zu verbessern? Alle Spielobjekte bewegen / drehen sich (fast) in jedem Frame, daher muss ich die Scheitelpunktpositionen wirklich neu berechnen. Die einzige Optimierung, die mir einfällt, ist eine Nachschlagetabelle für Rotationen, damit ich sie nicht berechnen muss. Würden Punkt-Sprites helfen? Irgendwelche bösen Hacks? Noch etwas?
Vielen Dank.