2011-01-17 6 views
4

Ich experimentierte mit Multisampling, um Anti-Aliasing auf iPhone und iPad auf iOS 4 durchzuführen. Der allgemeine Mechanismus verwendet Apples Erweiterung APPLE_framebuffer_multisample (http://www.khronos.org/registry/gles/extensions/APPLE/APPLE_framebuffer_multisample.txt) und wird in der Antwort auf diese Frage beschrieben: How do you activate multisampling in OpenGL ES on the iPhone? und dokumentiert von Apple in ihrem OpenGL ES Programming Guide.Welchen Leistungseinfluss hat die Verwendung von Multisampling-Anti-Aliasing auf iOS?

Es funktioniert wie beschrieben, aber die Zeichnungsleistung meiner Testanwendung leidet um etwa 50%, wenn ich die Anzahl der Samples auf 2 setze. Ich teste hauptsächlich auf einem iPhone 4, mit einem nicht Retina-fähigen Anwendung. Ich verwende die anderen Leistungsvorschläge von Apple in ihrer Dokumentation (mit glDiscardFramebufferEXT verwerfen Sie die an den Multisample-Framebuffer angehängten Renderbuffer, mit glClear den gesamten Framebuffer am Anfang des Frames usw.).

Der Leistungsaufwand beim Aktivieren von Multisampling auf diese Weise scheint mir überraschend groß zu sein. Seht ihr Jungs ähnliche Ergebnisse oder deutet das darauf hin, dass ich etwas falsch mache?

Antwort

1

Es ist nicht verwunderlich, dass Ihre Leistung um etwa 50% leidet, wenn Sie die Anzahl der Proben auf 2 gesetzt: Sie zeichnen zweimal die Proben! Multisampling bedeutet, dass Sie Ihre Szene mit einer höheren Auflösung als dem Bildschirm zu einem Offscreen-Puffer zeichnen und dann Filteralgorithmen verwenden, um den höher auflösenden Multisampling-Puffer auf die Bildschirmauflösung zu reduzieren, hoffentlich mit weniger Aliasing-Artefakten als das Finale Das Bild enthält tatsächlich mehr Details (gefilterte Ausgabe mit höherer Auflösung) als die Single-Sampling-Version.

Es ist ein sehr häufiges (wenn nicht das häufigste) Leistungsproblem in der Grafik: Je mehr Samples Sie zeichnen, desto langsamer Sie gehen.

2

Sie haben erwähnt, dass Sie dies auf ein iPhone laufen Faktor 4. Ist Ihr OpenGL ES-Schicht-Rendering auf dem vollen 2X Retina Display Skala? Das heißt, haben Sie contentScaleFactor auf dem OpenGL ES-Hosting-Layer auf [[UIScreen mainScreen] scale] festgelegt? Wenn ja, schiebst du eine große Anzahl von Pixeln an.

Ist die Füllrate begrenzt, bevor Sie das Multi-Sampling-Antialiasing anwenden? Um dies zu überprüfen, verwenden Sie das OpenGL ES-Instrument in Instruments für Ihre laufende Anwendung und aktivieren Sie die Tiler Utilization- und Renderer Utilization-Statistik. Wenn Ihre Anwendung eine hohe Renderer-Auslastung ohne aktiviertem MSAA anzeigt, ist die Ausführungsrate zunächst begrenzt. Darüber hinaus könnte das Hinzufügen von MSAA die Frameraten aufgrund dieses Engpasses erheblich reduzieren.

In einer Anwendung, die ich hatte, die Geometrie begrenzt war, nicht füllen begrenzt, sah ich nicht so groß von einer Verlangsamung, wenn Sie 4X MSAA in es auf einem iPhone 4 verwenden. Ich vermute, dass der Flaschenhals in Ihrem Anwendung besteht darin, Pixel auf den Bildschirm zu drücken.