Ich arbeite mit einem Team an einem kleinen Kachel- / Sprite-basierten PC-Spiel, und es treten Leistungsprobleme auf. Das letzte Mal, dass ich OpenGL verwendet habe, war um 2004, also habe ich mir selbst beigebracht, wie man das Kernprofil verwendet, und ich bin ein wenig verwirrt.
Ich muss in der Nähe von 250-750 48x48 Kacheln jeden Frame auf den Bildschirm zeichnen, sowie vielleicht rund 50 Sprites. Die Kacheln ändern sich nur, wenn ein neues Level geladen wird, und die Sprites ändern sich ständig. Einige der Kacheln bestehen aus vier 24x24-Teilen, und die meisten (aber nicht alle) Sprites haben die gleiche Größe wie die Kacheln. Viele der Kacheln und Sprites verwenden Alpha-Blending.
Im Moment mache ich das alles im Sofortmodus, von dem ich weiß, dass es eine schlechte Idee ist. Trotzdem, wenn eines unserer Teammitglieder versucht, es auszuführen, erhält es sehr schlechte Bildraten (~ 20-30 fps), und es ist viel schlimmer, wenn es mehr Kacheln gibt, besonders wenn viele dieser Kacheln von der Art sind, wie sie sind werden in Stücke geschnitten. Das alles lässt mich glauben, dass das Problem in der Anzahl der getätigten Draw Calls liegt.
Ich habe mir ein paar mögliche Lösungen ausgedacht, aber ich wollte sie von einigen Leuten leiten lassen, die wissen, wovon sie sprechen, damit ich meine Zeit nicht auf etwas Dummes verschwenden kann:
FLIESEN:
- Wenn ein Level geladen ist, ziehe alle Kacheln einmal in einen Framebuffer, der mit einer großen Huptextur verbunden ist, und zeichne einfach in jedem Frame ein großes Rechteck mit dieser Textur.
- Legen Sie alle Kacheln beim Laden des Levels in einen statischen Vertex-Puffer und zeichnen Sie sie auf diese Weise. Ich weiß nicht, ob es eine Möglichkeit gibt, Objekte mit unterschiedlichen Texturen mit einem einzigen Aufruf von glDrawElements zu zeichnen, oder ob ich das überhaupt tun möchte. Vielleicht einfach alle Kacheln in eine riesige Textur legen und lustige Texturkoordinaten in der VBO verwenden?
SPRITES:
- Zeichnen Sie jedes Sprite mit einem separaten Aufruf von glDrawElements. Dies scheint eine Menge Texturwechsel mit sich zu bringen, von denen mir gesagt wurde, dass sie schlecht sind. Sind Texturarrays hier vielleicht nützlich?
- Benutze irgendwie einen dynamischen VBO. Gleiche Texturfrage wie Nummer 2 oben.
- Sprites zeigen? Das ist wahrscheinlich albern.
Ist eine dieser Ideen sinnvoll? Gibt es eine gute Implementierung, über die ich nachsehen könnte?