Laden von Texturen in eine Android OpenGL ES App

Ich frage mich, ob jemand auf ein gutes Muster für das Laden von Texturen in einer Android Java & OpenGL ES App beraten könnte.

Meine erste Sorge ist die Bestimmung, wie viele Textur Namen zuzuordnen und wie kann ich effizient gehen, dies zu tun, bevor ich meine Ecken.

  • Wie man csv-Datei in Android lesen?
  • OnActivityResult () nicht in neue verschachtelte Fragment-API aufgerufen
  • Ziehe mehrere Schaltflächenansichten in Java
  • Ist Android Entwicklung restriktiv in irgendeiner Weise wie für das iPhone?
  • Wie importiere ich ZXING ins Android-Studio?
  • Aktivität onDestroy / Fragment's onDestroyView setzen Null-Übungen
  • Mein zweites Anliegen ist es, die Texturen zu laden. Ich muss die Textur auf der Grundlage meiner Spieldaten abschließen. Das bedeutet, dass ich mit Streichern herumspielen werde, was ich verstehe, was ich eigentlich nicht in meinem GL-Thread machen sollte.

    Insgesamt verstehe ich, was beim Laden von Texturen passiert ist, ich will einfach nur den besten Lebenszyklus raus. Gibt es noch andere Dinge, die ich mir vorstellen sollte?

  • Sicherheitsalarm: App enthält eingebettete private Schlüssel oder Keystore-Dateien
  • Ist Alpha / Beta apk Publishing unpublizierte App in Google Play?
  • Monodroid Proben / Widgets mit Quellcode
  • Herunterladen und Extrahieren von Zip-Datei in Android
  • Optionen für die Client Server-Kommunikation in Android
  • Gibt es eine Möglichkeit, um eine Webview laufen Android 4.0 auf einem akzeptablen Niveau zu machen?
  • 2 Solutions collect form web for “Laden von Texturen in eine Android OpenGL ES App”

    1) Du solltest so viele Texturnamen zuordnen wie du brauchst. Einer für jede Textur, die Sie verwenden.

    Das Laden einer Textur ist eine sehr schwere Operation, die die Rendering-Pipeline abbricht. Also, du sollst niemals Texturen in deiner Spielschleife laden. Sie sollten einen Ladezustand vor dem Anwendungszustand haben, in dem Sie die Texturen rendern. Der Ladezustand ist verantwortlich für das Laden aller im Rendering benötigten Texturen. Also, wenn du deine Geometrie machen musst, wirst du alle Texturen geladen haben und du musst dir das nicht mehr Sorgen machen.

    Beachten Sie, dass, nachdem Sie die Texturen nicht mehr benötigen, müssen Sie sie mit glDeleteTextures löschen.

    2) Wenn Sie damit feststellen, dass Sie unterschiedliche Texturen für verschiedene Ebenen oder ähnliches benötigen, dann sollten Sie die Level-Daten im Ladezustand verarbeiten und entscheiden, welche Texturen geladen werden müssen.

    Auf der anderen Seite, wenn Sie Text malen müssen (wie aktuelle Punktzahl), dann werden die Dinge komplizierter in OpenGL. Sie haben die folgenden Optionen: Prerender den benötigten Text zu Texturen (einfach), implementieren Sie Ihre eigene Bitmap-Schriftart-Engine (härter) oder verwenden Sie Bitmap und Canvas-Paar, um Texturen zu erzeugen (langsam).

    Wenn du einen begrenzten Satz von Nachrichten hast, die während des Spiels gezeigt werden sollen, dann würde ich sie höchstwahrscheinlich auf Texturen verzichten, da die Implementierung ziemlich trivial ist.

    Für die aktuelle Partitur genügt es, eine Textur zu haben, die eine Glyphe für Zahlen von 0 bis 9 hat und diese verwendet, um willkürliche Werte zu machen. Die Umsetzung wird ganz einfach sein.

    Wenn du länger lokalisierte Texte brauchst, dann musst du anfangen, über die generierenden Texturen zu denken. Grundsätzlich würden Sie eine Bitmap erstellen, in die Sie Text mit einem Canvas setzen. Dann würden Sie es als Textur hochladen und es als jede andere Textur rendern. Nachdem du es nicht mehr brauchst, dann würdest du es löschen. Diese Option ist langsam und sollte innerhalb der Anwendungsschleife vermieden werden.

    3) In Bezug auf Texturen und um das Beste aus der GPU zu bekommen, sollten Sie mindestens die folgenden Dinge in Ihrem Kopf (diese Dinge werden ein bisschen weiter fortgeschritten, und Sie sollten mit ihnen nur, nachdem Sie die Anwendung auf und läuft und halten Wenn Sie die Bildrate optimieren müssen):

    • Minimieren Sie Texturänderungen, da es eine langsame Operation ist. Optimal sollten Sie alle Objekte mit der gleichen Textur in einer Charge rendern. Dann ändern Sie die Textur und machen die Objekte, die das brauchen und so weiter.
    • Verwenden Sie Textur-Atlanten, um die Anzahl der Texturen (und Texturänderungen) zu minimieren
    • Wenn Sie viele Texturen haben, können Sie andere Bittiefe als 8888 verwenden, um alle Ihre Texturen in den Speicher zu passen. Die Verwendung von niedrigeren Bittiefen kann auch die Leistung verbessern.

    Dies sollte ein Kommentar zu Lauris Antwort sein, aber ich kann nicht mit 1 Repräsentant kommentieren, und es gibt eine Sache, die darauf hingewiesen werden sollte:

    Sie sollten Texturen jedes Mal neu laden, wenn Ihr EGL-Kontext verloren geht (dh wenn Ihre Anwendungen auf den Hintergrund und wieder zurückgestellt werden). Also, der richtige Ort, um sie zu laden, ist in der Methode

    public void onSurfaceChanged(GL10 gl, int width, int height) 

    Des Renderers. Offensichtlich, wenn Sie verschiedene Texturen haben, die geladen werden sollen (dh) auf der Spielebene, die Sie dann spielen, wenn Sie die Ebene ändern, sollten Sie die Texturen löschen, die Sie nicht verwenden und die neuen Texturen laden. Auch musst du verfolgen, was du neu laden musst, wenn der EGL-Kontext verloren geht.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.