Leistungssteigerung durch Mischen eines großen Quads

9

Ich habe ein Spiel, das ziemlich gut läuft (55-60fps) auf einem Retina-Display. Ich möchte ein Vollbild-Overlay hinzufügen, das mit der vorhandenen Szene verschmilzt. Aber auch bei einer kleinen Textur ist der Performance-Hit enorm. Gibt es eine Optimierung, die ich durchführen kann, um dies nutzbar zu machen?

Wenn ich eine 80x120 Textur verwende (die Textur wird im Flug gerendert, weshalb sie nicht quadratisch ist), bekomme ich 25-30FPS. Wenn ich die Textur verkleinere, steigt die Leistung, aber die Qualität ist nicht akzeptabel. Im Allgemeinen ist die Qualität der Überlagerung nicht sehr wichtig (es ist nur Beleuchtung).

Die Renderer-Auslastung liegt bei 99%.

Auch wenn ich eine quadratische Textur aus einer Datei (.png) verwende, ist die Leistung schlecht.

So erstelle ich die Textur:

%Vor%

Und hier ist das Rendering ...

%Vor%

Hier sind einige Benchmarks, die ich gemacht habe, als ich versucht habe, das Problem einzugrenzen. 'Keine Mischung' bedeutet I glDisable (GL_BLEND), bevor ich das Quad zeichne. 'Kein Pufferwechsel' bedeutet, dass ich vor dem Zeichnen nicht aus dem Offscreen-Puffer hin- und herwechsle.

%Vor%

Jede Hilfe wird geschätzt. Danke!

AKTUALISIEREN

Anstatt die ganze Lichtkarte danach zu mischen, schrieb ich einen Shader, um die Arbeit on the fly zu machen. Jedes Fragment sampelt und mischt aus der Lightmap (ähnlich wie Multitexturing). Zuerst war der Leistungsgewinn minimal, aber dann habe ich einen LowP Sampler2D für die Light Map verwendet und dann habe ich 45FPS bekommen.

Hier ist der Fragment-Shader:

%Vor%     
whooops 20.11.2011, 23:35
quelle

4 Antworten

3

Ok, ich denke, Sie sind mit den Einschränkungen der Hardware konfrontiert. Das Mischen eines bildschirmgroßen Quads über die gesamte Szene ist wahrscheinlich ein besonders schlechter Fall für die Kachel-basierte Hardware. Der PowerVR SGX (auf dem iPhone) ist für das Entfernen verborgener Oberflächen optimiert, um zu vermeiden, dass Dinge gezeichnet werden, wenn sie nicht benötigt werden. Es verfügt über eine geringe Speicherbandbreite, da es für Geräte mit geringer Leistungsaufnahme optimiert ist.

Also scannt ein Bildschirm-gemischter Quadrant und schreibt dann jedes Fragment auf den Bildschirm. Autsch!

Die glClear Beschleunigung ist verwandt - weil Sie GL sagen, dass Ihnen der Inhalt des Backbuffers vor dem Rendern egal ist, was das Laden des vorherigen Inhalts in den Speicher erspart.

Hier gibt es einen sehr guten Überblick über die iOS-Hardware: Ссылка

Wie bei einer tatsächlichen Lösung - würde ich versuchen, Ihr Overlay direkt auf die Spielszene zu rendern.

Zum Beispiel sollte Ihre Renderschleife wie folgt aussehen:

%Vor%     
Justicle 21.11.2011, 22:01
quelle
1

Wenn Sie mit einem Renderziel auf einem PowerVR-Chip rendern, zu einem anderen Renderziel wechseln und rendern und dann zu einem vorherigen Renderziel zurück wechseln, erleiden Sie einen größeren Performance-Treffer. Diese Art von Zugriffsmustern wird vom OpenGL ES Analyzer, der in den neuesten Geräten integriert ist, als "Logical Buffer Load" bezeichnet.

Wenn Sie Ihre Renderreihenfolge so ändern, dass Sie zuerst Ihr Lightmap-Renderziel zeichnen, dann Ihre Szene zum Framebuffer rendern und dann die Vollbild-Mischung der Lightmap-Renderzieltextur durchführen, sollte Ihre Performance viel höher sein.

    
Justin Larrabee 27.08.2012 04:55
quelle
0

Ich kann bestätigen, dass auf iPad 1 mit iOS 4.2 GL_BLEND für ein Vollbild-Quadd zwischen 18 und 31 fps aktiviert / deaktiviert wird. In beiden Läufen betrug die Renderer-Auslastung 90-100%.

    
pTymN 26.02.2013 15:20
quelle
0

Vergewissern Sie sich, bevor Sie an der Textur fummeln, dass Ihr Shader optimiert ist. Beim Füllen eines 960x640-Bildschirms (614400 Pixel) hat jede Operation im Fragment-Shader einen großen Einfluss.

Eine gute Sache, um eine spezifische Version Ihres Fragment-Shaders für diese Situation zu erstellen. Es sollte so etwas sein:

%Vor%

Erstellen Sie ein anderes Programm mit diesem Fragment-Shader und verwenden Sie es, bevor Sie Ihr großes Quad zeichnen, und stellen Sie dann das normale Programm wieder her. Das iPhone 4 ist in der Lage, etwa 7 Vollbild-1: 1-Textur-Quads pro Bild mit Überblendung zu rendern, fällt aber mit einem ausgeklügelteren Shader schnell auf 1 ab.

(Zusätzlich versuchen Sie in Ihrem Fall, Ihre Überlagerungsstruktur zuerst zu rendern, dann die normalen Elemente, dann die Textur zum Rest. Es sollte die Leistung um einen erheblichen Abstand verbessern.)

    
Brunni 23.05.2013 21:03
quelle

Tags und Links