2013-01-17 15 views
5

Während ich einige Tests für ein kleines Projekt für iPhone/iPad an der ich arbeite, beobachtete ich, dass es beim Zeichnen von Wireframes mit glDrawElements mit GL_LINES zu großen CPU-Leistungseinbußen kommt .glDrawElements mit GL_LINES erzwingt gleRunVertexSubmitARM? (oder: Warum ist das Zeichnen von Wireframes bei iOS langsam?)

Dies ist das Szenario:

  • ein Modell mit 640 Scheiteln (4 Schwimmer für Position, 3 Schwimmer für Normalen, keine Ausrichtungsprobleme ... alle auf 4 Byte Grenzen)
  • 3840 Indizes (unsigned short)
  • beiden Scheitel und Indizes verwenden VBOs (kein VAO)
  • das obige Modell mit glDrawElements mit GL_TRIANGLES gezeichnet funktioniert

Dann:

  • gleiche Modell mit 640 Scheiteln
  • 2560 Indizes
  • VBOs und keine VAO
  • mit glDrawElements mit GL_LINES gezogen löst kontinuierliche Anrufe gleRunVertexSubmitARM, CPU-Auslastung Himmel Raketen ...

In beiden Fällen sehen die Modelle wie erwartet und keine glErrors um ...

Es scheint, dass das Problem gerätabhängig ist. Ich erlebe es auf einem iPhone 3GS und iPhone 4, NICHT auf einem iPad 2 noch den Simulatoren. Auf einem iPad 2 frame-time CPU = 1 ms und keine Aufrufe von gleRunVertexSubmitARM, auf einem iPhone 4 frame-time CPU = 12 ms und kontinuierliche Aufrufe von gleRunVertexSubmitARM.

Kann jemand dieses Verhalten erklären oder darauf hinweisen, welche Fehler ich machen könnte?

Jeder Einblick wird sehr geschätzt. Vielen Dank im Voraus,

Franc

Antwort

0

keine einfache Antwort auf eine nicht einfache Frage würde ich sagen.

Wie auch immer, der Grund, warum zwei Geräte der gleichen "Familie" sich unterschiedlich verhalten, könnte von vielen Faktoren abhängen.

Zunächst einmal montieren sie verschiedene GPUs (Ich bin sehr sicher, dass Sie wissen, dass es schon so, sorry, das Offensichtliche zu erklären), die die folgenden Unterschiede bringt:

  • iPhone 4 und iPhone 3GS Halterung die gleiche GPU , der PowerVR SGX535
  • IPAD 2 verwendet die PowerVR SGX543MP2

Vor allem letzteres eine Weiterentwicklung des ersten mit einem ganz anderen Durchsatz und einer neueren Architektur.

Dies allein erklärt sowieso nicht alles, der Grund, warum Sie viel mehr Aufrufe an gleRunVertexSubmitARM finden, könnte OpenGL-Treiber Implementierung von PowerVR auf seinen GPUs erklärt werden, höchstwahrscheinlich führt der SGX535 GPU-Treiber die Operationen, die Sie über eine benötigen Haken Sie diese Funktion an.

Last, but not least, Leistung klug, mit GL_LINES Zeichnung ist die meiste Zeit sehr ineffizient aus mehreren Gründen:

  • führt keine versteckte Geometrie Erkennung
  • Keinerlei Gesicht nicht durchführen
  • Culling
  • Lese um (und über meine eigene Erfahrung von 2-3 Jahren), mit GL_LINE_WIDTH oder GL_LINE_SMOOTH bewirkt, dass der Fahrer eine „Software“ macht keine HW-Beschleunigung unter Verwendung auszuführen. Dies hängt von der GPU und der OpenGL-Treiber Implementierung
  • Wenn ein gefülltes Polygon gerendert wird, kann der Fahrer die Operationen mit „Hierarchical Depth Buffer“ optimieren, mit GL_LINES es nicht (wieder, das eine Menge auf den Fahrer hängt aber dies ist ein sehr verbreiteter Aspekt)
  • Einige Treiber übersetzt Ihre GL_LINES im Moment des Renderings in Dreiecke ineinander greifen. Dies ist etwas, was ich nicht beweisen kann, aber ein sehr häufiges Thema mit früheren Spielentwickler-Freunden.

Ich hoffe, dass Sie in irgendeiner Weise geholfen zu haben.

Ciao Maurizio

0

ich auf dem PC bin, aber ich fühle mich dies relevant ist. Ich bemerkte die Framerate im Drahtmodell-Modus: glPolygonMode (GL_FRONT_AND_BACK, GL_LINE) ...

war 10x langsamer, wenn glEnable (GL_LINE_SMOOTH);

Sie können es mit diesem Befehl deaktivieren: glDisable (GL_LINE_SMOOTH);