2012-03-30 5 views
5

Ich mache eine 3D-iPhone-Anwendung, die viele Werbetafeln verwenden. Mein Bildpuffer ist auf Retina-Bildschirm doppelt größer, weil ich ihre Qualität auf iPhone 4 erhöhen möchte. Das Problem ist, dass Fragment Shader aufgrund der Framebuffer-Größe viel mehr Zeit verbrauchen. Gibt es eine Möglichkeit, Retina-Bildschirm und High-Definition-Texturen zu verwalten, ohne die Shaderpräzision zu erhöhen?Shader-Optimierung für Retina-Bildschirm auf iOS

Antwort

9

Wenn Sie mit einem Framebuffer mit der vollen Auflösung des Retina-Displays rendern, werden im Vergleich zum selben physischen Bereich eines Nicht-Retina-Displays viermal so viele Pixel überstrichen. Wenn Sie aufgrund der Komplexität Ihrer Shader eine fill-rate-Beschränkung haben, dauert das Rendering für jeden Frame viel länger.

Zuerst sollten Sie überprüfen, ob Sie tatsächlich durch den Fragmentverarbeitungsteil der Rendering-Pipeline eingeschränkt sind. Führen Sie das OpenGL ES Driver-Instrument für Ihre Anwendung aus und sehen Sie sich die Statistiken zu Tiler und Renderer Utilization an. Wenn die Renderer-Auslastung nahezu 100% beträgt, bedeutet dies, dass Sie durch Ihre Fragment-Shader und Ihre allgemeine Fähigkeit, Pixel zu pushen, eingeschränkt sind. Wenn Sie jedoch den Prozentsatz Ihrer Tiler-Auslastung dort oben sehen, bedeutet dies, dass Sie auf Geometrie beschränkt sind und Änderungen der Bildschirmauflösung sich nicht auf die Leistung auswirken und die Komplexität und Größe Ihrer Vertex-Daten verringern.

Angenommen, Sie sind durch Ihre Fragment-Shader eingeschränkt, können Sie einige Maßnahmen ergreifen, um die Leistung der iOS-GPUs erheblich zu verbessern.

In Ihrem Fall klingt es wie Texturgröße könnte ein Problem sein. Das erste, was ich tun würde, ist die Verwendung von PowerVR Texture Compressed (PVRTC) Texturen anstelle von Standard-Bitmap-Quellen. PVRTC-Texturen werden in einem komprimierten Format im Speicher gespeichert und können viel kleiner als entsprechende Bitmaps sein. Dies könnte einen viel schnelleren Zugriff ermöglichen, indem Cachetreffer bei Texturlesevorgängen erhöht werden.

Machen Sie Ihre Texturen zu einer Zweierpotenz und aktivieren Sie Mipmaps. Ich habe gesehen, dass Mipmaps wirklich hilfreich für größere Texturen sind, die oft zusammenschrumpfen, um auf kleineren Objekten zu erscheinen. Dies klingt definitiv nach dem Fall für Ihre Anwendung, die Retina und Nicht-Retina-Geräte unterstützen muss.

Vermeiden Sie abhängige Texturablesungen in Ihren Fragment-Shadern wie die Pest. Alles, was eine Berechnung ausführt, um eine Texturkoordinate zu bestimmen, oder eine Textur, die in eine Verzweigungsanweisung fällt, löst eine abhängige Texturlese aus, die auf den iOS-GPUs mehr als eine Größenordnung langsamer sein kann. Während normaler Texturlesevorgänge können die PowerVR-GPUs ein wenig vor Texturwerten lesen, aber wenn Sie eine abhängige Textur lesen, können Sie diese Optimierung verlieren.

Ich könnte über verschiedene Optimierungen (mit Lowp oder Mediump Genauigkeit anstelle von Highp, wo angemessen, etc.), ich habe had a little help in this area myself, aber diese scheinen wie die ersten Dinge, die ich konzentrieren würde. Schließlich können Sie auch versuchen, Ihre Shader über PowerVR's profiling editor laufen zu lassen, was Ihnen Zykluszeitschätzungen für die beste und schlechteste Leistung dieser Shader geben kann.

Die Retina-Anzeigegeräte sind nicht einmal die schlimmsten Täter, wenn es um die Einschränkungen von Fragment-Shadern geht. Versuchen Sie, etwas Rendering auf den gesamten Bildschirm des iPad 1 performant zu machen, denn es hat mehr Pixel als das iPhone 4/4S, aber eine viel langsamere GPU als das iPad 2/3 oder iPhone 4S. Wenn Sie etwas auf dem iPad 1 gut laufen können, wird es gut für alles andere da draußen sein (sogar das Retina iPad).

+0

Danke für all diese Präzisionen. Die Renderer-Auslastung beträgt ca. 99% und der Tiler ca. 5%. Ich denke, Mipmapping wird die Performance nicht verbessern, da die meisten meiner Billboards wie 2D-Sprites angezeigt werden (Texturen sind nicht skaliert). Ich werde PowerVRs Profileditor ausprobieren und meine App auf einem iPad 1 testen. – Klem

+0

Danke Brad. Ich habe in den letzten 6 Monaten Shadern wie verrückt programmiert und als ich gelernt habe, Texturkoordinaten zu verändern, war es wie ein Licht, das in meinem Gehirn eingeschaltet wird. Aber ich habe mich in letzter Zeit gefragt, ob es besser ist, von zwei verschiedenen Texturen zu lesen oder die Basis- und Normalkarten in einer einzigen Textur zu kacheln. Welche ist schneller. Apples Best Practices für den Shader-Guide impliziert, dass, wenn die Änderung an der Texcoord im Vertex-Shader vorgenommen wird, keine abhängige Textur gelesen wird. Ich werde das versuchen, um zu sehen, ob das iphone4-Rendering schneller wird. Und vielleicht auch verschiedene Karten ausprobieren. – badweasel