OpenGL (ES 1.0) Triangle Optimierung?
Übersicht

![]() |
Kernle 32DLLBetreff: OpenGL (ES 1.0) Triangle Optimierung? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Leute, ich habe ein kleines Problemchen. Ich entwickle im Moment für das Android Betriebssystem mit OpenGL ES. Da die Ressourcen des Endgerätes begrenzt sind, muss ich etwas effizienter als sonst programmieren. Das Hauptaugenmerk fällt dabei natürlich auf den Renderer.
Im Moment lade und speichere ich meine 2D/3D Modelle als pure Vertice Daten (3 Floats für Koordinaten, + 4 Floats für Farbangaben). Besonders bei deteilreichen Modells werden die Dateien schnell groß und dauern ewig zu laden (5100 Triangles ergeben so eine ca. 1mb große Datei!). Parallel dazu habe ich mich informiert was für Rendermethoden es außer GL_TRIANGLE noch gibt. Besonders GL_TRIANGLE_STRIP fiel mir dabei ins Auge (Bedenke: Android benutzt OpenGL ES, d.h. es kann nicht alle Rendermethoden vom "normalen" OpenGL). Jetzt ist mir die Idee gekommen beide Probleme auf einmal zu lösen, indem ich das Modell so gut wie möglich mit Stripes zeichne, und den "Rest" einfach wie gehabt mit normalen Triangles. Zum einen könnte ich mir durch die Stripes jede Menge zu speicherende Vertices sparen, und dadurch die Dateigröße drücken und die Ladegeschwindigkeit erhöhe, und zum anderen erhoffe ich mir aus den Stripes einen Performance Gewinn. Das neue Problem ist nun, wie ich mein Modell mit meinen Triangles quasi so "optimiere", das ich möglichst viele Triangles durch Stripes ersetzen kann. Dazu habe ich nun Konsequent zwei Fragen: - Wie performant sind n Zeichen Aufrufe für Stripes VS ein Aufruf für alle Triangles - Wie "filter" oder "optimiere" ich aus meinen Triangles möglichst viele Triangle Stripes? Zu Optimierung habe ich derzeit folgenden Ansatz: - Jedes Triangle durchgehen - Prüfen ob ein anderes Triangle gemäß der Stripe Gesetzmäßigkeit "anhängbar" ist - Wenn Ja, neues Stripe erstellen und sich von nun an auf dieses beziehen (die Prüfung auf die letzten 2 Vertices des Stripes beziehen) Außerdem sind mir bei meinen bisherigen Optimierungsversuchen folgendes aufgefallen: Es ist egal in welcher Reihenfolge die Vertices eines Triangles gezeichnet werden, sofern die ursprüngliche Ausrichtung des Triangles erhalten bleibt (heißt für die Optimierung: Ich kann die Reihenfolge also Ringförmig ändern) So long, Kernle PS: Ich poste das mal ins Smalltalk weil es nicht direkt mit was mit BB zu tun hat, auch wenn ich die Optimierungsroutine derzeit in BMax schreibe (Modelldaten schreibe ich mit BB in eine Datei) |
||
Mein PC: "Bluelight" - Xtreme Gamer PC [Video]
Meine Projekte: Cube-Wars 2010 [Worklog] Anerkennungen: 1. Platz BCC #7 , 1. Platz BCC #22 , 3. Platz BAC #89 Ich war dabei: NRW Treff III, IV ; Frankfurter BB Treffen 2009 |
- Zuletzt bearbeitet von Kernle 32DLL am Di, Jan 26, 2010 22:08, insgesamt 3-mal bearbeitet
![]() |
Arrangemonk |
![]() Antworten mit Zitat ![]() |
---|---|---|
wieso speicherst du 2 floats coordinaten und 4 floats farben?
das is in sachen performence sehr ungüngstig texturen und 2d grafiken würd ich in dxt (ich glaub dx1) oder so komprimieren (ogl müsste das auch native können -> komprimierte texturen im vram = besser) und 3 floats für die trangles und wenn du durch jedes trangle durchiderierst und die in strypes umwandelst kannst sie in der zeit genauso gut zeichnen lassen wichtiger für performence ist das radius(d(camera((ich würd den punkt relativ vor der camera machen, dann kannst dir das frustum cvullint prinzipiell sparen)),vertex <= maxdistance)) dann noch backface = dotproduct(camerarichtung,vertexnormale) < 0 -> ignorieren und die trangles in der anständigen baumstruktur organisieren |
||
ingeneur |
![]() |
Kernle 32DLL |
![]() Antworten mit Zitat ![]() |
---|---|---|
Arg, meinte auch 3 Floats für die Koordinaten. Das Hauptproblem bleibt aber das es sich bei dem Teil nur um Open GL ES (1.0 übrigens) handelt. D.h. es gibt keine nativen ladebefehle, müsste mir die Befehle also selber schreiben, was ich nicht kann (zum dumm dafür ![]() Was mir allerdings noch nicht ganz klar ist, ist was du mit Baumstruktur meinst. Achja, die Optimierung ist außerhalb des eigentlichen Programms vorzunehmen. Der Plan ist die Triangles in Stripes zu optimieren, und das ganze so in ein Format zu schreiben, was ich dann später auslesen kann. Eine richtig gute Optimierung dürfte Zeitaufwendig sein, d.h. optimierung zur Laufzeit wäre Kopfschuss für die Performance. |
||
Mein PC: "Bluelight" - Xtreme Gamer PC [Video]
Meine Projekte: Cube-Wars 2010 [Worklog] Anerkennungen: 1. Platz BCC #7 , 1. Platz BCC #22 , 3. Platz BAC #89 Ich war dabei: NRW Treff III, IV ; Frankfurter BB Treffen 2009 |
![]() |
Nibor |
![]() Antworten mit Zitat ![]() |
---|---|---|
Evtl. kann die Verwendung von Indices die Datenmenge auch reduzieren.
Falls es das bei dir gibt, empfehle ich dir die Benutzung von VertexBufferObjects. Generell ist es (bei modernerer Hardware) meist schneller weniger Surfaces bzw. glBegin/glDraw.../usw. Aufrufe zu verwenden auch wenn man dafür geringe Datenmengen z.B. mehrmals verwenden muss. Falls das Modellierungsprogramm, das du verwendest, *.md2 Dateien speichern kann, könntest du dir dieses Format auch mal näher anschauen, da die Geometrie auch als TriangleStrip/TriangleFan-Daten gespeichert ist und du einfach diese auslesen könntest. Was die eigenständige Generierung von Trianglestrips angeht: Da hab ich keine Ahnung, wie man das am besten macht. Hoffentlich ist das Hilfreich. Edit: hier eine Seite, die verschiedene Dateiformate, auch *.md2 beschreibt. http://www.wotsit.org/list.asp?al=M |
||
http://www.blitzforum.de/showcase/203/ |
- Zuletzt bearbeitet von Nibor am Di, Jan 26, 2010 22:02, insgesamt einmal bearbeitet
![]() |
Arrangemonk |
![]() Antworten mit Zitat ![]() |
---|---|---|
öhm unity geht doch auch für iphone/android, sowiel ich weiß
das is nen besseres framework als ogl alleine |
||
ingeneur |
![]() |
Kernle 32DLL |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nibor hat Folgendes geschrieben: Evtl. kann die Verwendung von Indices die Datenmenge auch reduzieren.
Falls es das bei dir gibt, empfehle ich dir die Benutzung von VertexBufferObjects. Generell ist es (bei modernerer Hardware) meist schneller weniger Surfaces bzw. glBegin/glDraw.../usw. Aufrufe zu verwenden auch wenn man dafür geringe Datenmengen z.B. mehrmals verwenden muss. Falls das Modellierungsprogramm, das du verwendest, *.md2 Dateien speichern kann, könntest du dir dieses Format auch mal näher anschauen, da die Geometrie auch als TriangleStrip/TriangleFan-Daten gespeichert ist und du einfach diese auslesen könntest. Was die eigenständige Generierung von Trianglestrips angeht: Da hab ich keine Ahnung, wie man das am besten macht. Hoffentlich ist das Hilfreich. Das wäre eine Idee mit dem md2 Format. Allerdings hat die vergangenheit gezeigt das ich es nicht auf die Reihe bekomme eigene Loader für solche Formate zu schreiben. Allerdings denke ich gerade bei Android wird sich dazu irgendwo was finden lassen. Arrangemonk: Davon abgesehen das Unity soweit ich weis nicht für Android geht (Android = Java Apps, iPhone weis ich aus dem Stehgreif nicht), brauche ich kein ganzes Framework. Braucht ja auch wieder alles platz in der letzendlichen App. |
||
Mein PC: "Bluelight" - Xtreme Gamer PC [Video]
Meine Projekte: Cube-Wars 2010 [Worklog] Anerkennungen: 1. Platz BCC #7 , 1. Platz BCC #22 , 3. Platz BAC #89 Ich war dabei: NRW Treff III, IV ; Frankfurter BB Treffen 2009 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group