FloatBuffer.put (float []) mit einem relativ großen Float-Array sollte wesentlich schneller sein. Die einzelnen Put (Float) Calls haben viel Overhead.
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?
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.
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.
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?
FloatBuffer.put (float []) mit einem relativ großen Float-Array sollte wesentlich schneller sein. Die einzelnen Put (Float) Calls haben viel Overhead.
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.
Tags und Links optimization android opengl-es