Schnelle dynamische Vertices in OpenGL ES 2.0 auf Android

9

Ich versuche, mit OpenGL ES 2.0 eine Reihe von Zeilen auf Android zu zeichnen, und ich muss den besten Weg kennen, dies zu tun.

Im Moment habe ich eine Klasse namens LineEngine erstellt, die einen FloatBuffer aller zu zeichnenden Scheitelpunkte aufbaut und dann alle Linien auf einmal zeichnet. Das Problem ist, dass FloatBuffer.put () anscheinend sehr langsam ist und CPU-Zeit verschlingt wie verrückt.

Hier ist meine Klasse

%Vor%

Gibt es eine bessere Möglichkeit, all diese Zeilen zusammenzufassen?

    
EmbMicro 29.05.2012, 03:37
quelle

3 Antworten

1

Was Sie versuchen, ist SpriteBatching. Wenn Sie möchten, dass Ihr Programm in OpenGLs stabil ist, müssen Sie Folgendes überprüfen (eine Liste dessen, was Ihr Programm verlangsamt):

-Changing zu vielen openGL ES states jeden Rahmen.

-Enable // Dissable (Texturen usw.) immer wieder. Sobald Sie etwas aktivieren, müssen Sie es nicht erneut tun, es wird automatisch seinen Rahmen angewendet.

- Verwendung von vielen Assets anstelle von SpriteSheets. Ja, das macht einen enormen Leistungseinfluss. Zum Beispiel, wenn Sie 10 Bilder haben, müssen Sie für jedes Bild eine andere Textur laden, und das ist LANGSAM. Ein besserer Weg, dies zu tun, ist ein SpriteSheet zu erstellen (Sie können google nach freien SpriteSheet-Ersteller suchen).

- Ihre Bilder sind von hoher Qualität. Ja! Überprüfen Sie Ihre Auflösung und Dateierweiterung. Bevorzugen Sie .png-Dateien.

-Für den api 8 float buffer bug (Sie müssen stattdessen int buffer verwenden, um den Fehler zu beheben).

- Verwendung von Java-Containern Dies ist der größte Fehler, wenn Sie String-Verkettung (das ist kein Container, aber es gibt jedes Mal eine neue Zeichenfolge) oder eine Liste oder einen anderen Container, die Wahrscheinlichkeit, dass Ihr Programm aufgrund der Garbage Collection langsam ist. Für die Eingabehandhabung würde ich vorschlagen, dass Sie eine teqnique suchen, die die Pool-Klasse genannt wird. Seine Verwendung besteht darin, Objekte zu recyceln, anstatt neue zu erstellen. Müllsammler ist der große Feind, versuchen Sie ihn glücklich zu machen und vermeiden Sie jede Programmiertechnik, die ihn nennen könnte.

- Laden Sie niemals Dinge im laufenden Betrieb, sondern erstellen Sie eine Ladeprogrammklasse und laden Sie am Anfang der App alle erforderlichen Ressourcen.

Wenn Sie diese Liste implementieren, sind Ihre Chancen wahrscheinlich, dass Ihr Programm robust ist.

Ein letzter Zusatz. Was ist ein Sprite-Dosierer? Ein SpriteBatcher ist eine Klasse, die eine einzelne Textur zum Rendern mehrerer Objekte verwendet. Es erstellt automatisch Scheitelpunkte, Indizes, Farben, U - V - Koordinaten und es wird sie als Stapel darstellen. Dieses Muster spart sowohl GPU- als auch CPU-Leistung. Von Ihrem geposteten Code kann ich nicht sicher sein, was die CPU verlangsamt, aber aus meiner Erfahrung ist aufgrund einer (oder mehr) Dinge der Liste, die ich zuvor erwähne. Überprüfen Sie die Liste, folgen Sie ihr, suchen Sie google nach SpriteBatching und ich bin sicher, dass Ihr Programm schnell läuft. Hoffe, ich habe geholfen!

Edit: Ich denke, ich habe herausgefunden, was Ihr Programm verlangsamt, Sie nicht den Puffer kippen! Sie setzen nur die Position zurück. Sie fügen nur hinzu, fügen Sie weitere Objekte hinzu und Sie verursachen Pufferüberlastung. In der Reset-Methode kippen Sie einfach den Puffer. mlineColors.flip mLinePaints.flip erledigt die Aufgabe. Stellen Sie sicher, dass Sie jeden Frame aufrufen, wenn Sie für jeden Frame neue Verizierungen senden.

    
KostasRim 12.12.2014, 22:04
quelle
0
___ answer23899756 ___

Wählen Sie einfach eine sehr einfache native Funktion, die von Ihrer Klasse aufgerufen wird. Sie können %code% direkt auf OpenGL setzen, ohne die CPU-Zeit mit einer dummen Pufferschnittstelle zu beenden.

    
___ tag123android ___ Android ist das mobile Betriebssystem von Google, das zum Programmieren oder Entwickeln von digitalen Geräten (Smartphones, Tablets, Automobile, Fernseher, Wear, Glass, IoT) verwendet wird. Verwenden Sie für Themen rund um Android Android-spezifische Tags wie android-intent, nicht intent, android-activity, nicht activity, android-adapter, nicht adapter usw. Bei anderen Fragen als der Entwicklung oder Programmierung, aber im Zusammenhang mit Android Framework, verwenden Sie Der Link: https://android.stackexchange.com. ___ qstntxt ___

Ich versuche, mit OpenGL ES 2.0 eine Reihe von Zeilen auf Android zu zeichnen, und ich muss den besten Weg kennen, dies zu tun.

Im Moment habe ich eine Klasse namens LineEngine erstellt, die einen FloatBuffer aller zu zeichnenden Scheitelpunkte aufbaut und dann alle Linien auf einmal zeichnet. Das Problem ist, dass FloatBuffer.put () anscheinend sehr langsam ist und CPU-Zeit verschlingt wie verrückt.

Hier ist meine Klasse

%Vor%

Gibt es eine bessere Möglichkeit, all diese Zeilen zusammenzufassen?

    
___ tag123optimierung ___ Optimierung ist der Akt der Verbesserung einer Methode oder eines Designs. In der Programmierung nimmt die Optimierung normalerweise die Form an, die Geschwindigkeit eines Algorithmus zu erhöhen oder die benötigten Ressourcen zu reduzieren. Eine weitere Bedeutung der Optimierung sind numerische Optimierungsalgorithmen. ___ antwort13711898 ___

FloatBuffer.put (float []) mit einem relativ großen Float-Array sollte wesentlich schneller sein. Die einzelnen Put (Float) Calls haben viel Overhead.

    
___ tag123opengles ___ Teilmenge der OpenGL 3D-Grafik-API, die für eingebettete Geräte wie Mobiltelefone entwickelt wurde. ___ answer27452839 ___

Was Sie versuchen, ist SpriteBatching. Wenn Sie möchten, dass Ihr Programm in OpenGLs stabil ist, müssen Sie Folgendes überprüfen (eine Liste dessen, was Ihr Programm verlangsamt):

-Changing zu vielen openGL ES states jeden Rahmen.

-Enable // Dissable (Texturen usw.) immer wieder. Sobald Sie etwas aktivieren, müssen Sie es nicht erneut tun, es wird automatisch seinen Rahmen angewendet.

- Verwendung von vielen Assets anstelle von SpriteSheets. Ja, das macht einen enormen Leistungseinfluss. Zum Beispiel, wenn Sie 10 Bilder haben, müssen Sie für jedes Bild eine andere Textur laden, und das ist LANGSAM. Ein besserer Weg, dies zu tun, ist ein SpriteSheet zu erstellen (Sie können google nach freien SpriteSheet-Ersteller suchen).

- Ihre Bilder sind von hoher Qualität. Ja! Überprüfen Sie Ihre Auflösung und Dateierweiterung. Bevorzugen Sie .png-Dateien.

-Für den api 8 float buffer bug (Sie müssen stattdessen int buffer verwenden, um den Fehler zu beheben).

- Verwendung von Java-Containern Dies ist der größte Fehler, wenn Sie String-Verkettung (das ist kein Container, aber es gibt jedes Mal eine neue Zeichenfolge) oder eine Liste oder einen anderen Container, die Wahrscheinlichkeit, dass Ihr Programm aufgrund der Garbage Collection langsam ist. Für die Eingabehandhabung würde ich vorschlagen, dass Sie eine teqnique suchen, die die Pool-Klasse genannt wird. Seine Verwendung besteht darin, Objekte zu recyceln, anstatt neue zu erstellen. Müllsammler ist der große Feind, versuchen Sie ihn glücklich zu machen und vermeiden Sie jede Programmiertechnik, die ihn nennen könnte.

- Laden Sie niemals Dinge im laufenden Betrieb, sondern erstellen Sie eine Ladeprogrammklasse und laden Sie am Anfang der App alle erforderlichen Ressourcen.

Wenn Sie diese Liste implementieren, sind Ihre Chancen wahrscheinlich, dass Ihr Programm robust ist.

Ein letzter Zusatz. Was ist ein Sprite-Dosierer? Ein SpriteBatcher ist eine Klasse, die eine einzelne Textur zum Rendern mehrerer Objekte verwendet. Es erstellt automatisch Scheitelpunkte, Indizes, Farben, U - V - Koordinaten und es wird sie als Stapel darstellen. Dieses Muster spart sowohl GPU- als auch CPU-Leistung. Von Ihrem geposteten Code kann ich nicht sicher sein, was die CPU verlangsamt, aber aus meiner Erfahrung ist aufgrund einer (oder mehr) Dinge der Liste, die ich zuvor erwähne. Überprüfen Sie die Liste, folgen Sie ihr, suchen Sie google nach SpriteBatching und ich bin sicher, dass Ihr Programm schnell läuft. Hoffe, ich habe geholfen!

Edit: Ich denke, ich habe herausgefunden, was Ihr Programm verlangsamt, Sie nicht den Puffer kippen! Sie setzen nur die Position zurück. Sie fügen nur hinzu, fügen Sie weitere Objekte hinzu und Sie verursachen Pufferüberlastung. In der Reset-Methode kippen Sie einfach den Puffer. mlineColors.flip mLinePaints.flip erledigt die Aufgabe. Stellen Sie sicher, dass Sie jeden Frame aufrufen, wenn Sie für jeden Frame neue Verizierungen senden.

    
___ qstnhdr ___ Schnelle dynamische Vertices in OpenGL ES 2.0 auf Android ___
tjltjl 04.12.2012 21:05
quelle
0

Wählen Sie einfach eine sehr einfache native Funktion, die von Ihrer Klasse aufgerufen wird. Sie können float[] direkt auf OpenGL setzen, ohne die CPU-Zeit mit einer dummen Pufferschnittstelle zu beenden.

    
the swine 27.05.2014 22:06
quelle

Tags und Links