2015-05-15 15 views
22

Ich habe eine WebGL-Anwendung, die ich entwickeln, und ich habe gegen einige ziemlich ernsthafte Leistungsbedenken mit Retina Display Macbook Pros. Ich teste gerade ein 15 Zoll MacBook mit Intel Iris Pro GPU, das mit voller Auflösung rendert, was mir eine Leinwandauflösung von 3810 x 2030 mit einem Vollbild-Chrome-Fenster gibt. Meine Anwendung rendert ungefähr 100k Vertices pro Frame.WebGL Leistungsprobleme mit Retina Macbook Pro

Wenn ich jetzt die Anwendung auf ein Gerätepixel-Verhältnis von 1 (keine Retina-Skalierung) eingestellt, ist die Leistung der Anwendung solide, fällt nie unter 60 fps, aber die Bildqualität ist inakzeptabel. Wenn ich auf das Pixelverhältnis der Retina von 2 umschalte, verbessert sich die Bildqualität dramatisch, aber meine Framerate fällt auf ungefähr 20-30 fps.

Nun, ich bin kein Fremder bei GPU-Programmierung, also die Gründe, warum dies passiert, sind für mich offensichtlich. Was ich frage mich ist, hat jemand da draußen irgendwelche Workarounds oder Möglichkeiten gefunden, WebGL Zeichnung für ultra-hochauflösende Displays mit schlechten GPUs wie das Retina Macbook Pro zu optimieren? Gibt es irgendwelche nicht offensichtlichen Tipps oder Tricks, die Menschen durch Versuch und Irrtum gefunden haben, um dieses Problem zu lösen oder zumindest etwas besser zu machen?

Jede Hilfe wäre willkommen. Vielen Dank.

Edit: Kleines Update mit einer interessanten Entdeckung. Ich habe meinen Browser-Fenster in ein externes Display an das Macbook angeschlossen, und wenn sie bei einer DPR von 1-Rendering ist die Leistung sogar noch höher auf dem externen Display, als es auf dem macbook ist, auch mit der exakt gleichen Auflösung und die Bild Qualität ist viel besser.

Also selbst wenn Sie einen verkleinerte Bildpuffer auf einem Macbook machen Pro, es skaliert sie noch auf, was wahrscheinlich ist, was die schlechte Bildqualität verursacht (es wird die Aufstockung mit bilinearer Filterung, es verschwommen, als es machen würde sei, wenn das Originalbild unverändert angezeigt würde).

+0

Wenn Sie die Möglichkeit haben, DPI zu wählen, haben Sie versucht, es auf "1" zu halten, sondern stattdessen doppelt so große Texturen zu verwenden und sie zu skalieren? – Eric

+0

Das Problem ist, dass, wenn der endgültige Framebuffer nicht auf die maximale Auflösung des Retina-Displays eingestellt ist, er immer noch wie Mist aussieht.Das Retina-Display ist sehr interessant: Wenn Sie mit der beabsichtigten Auflösung rendern, sieht es fantastisch aus, aber wenn Sie etwas niedriger rendern, sieht es einfach wie kompletter Müll aus. – aeskreis

+1

Es könnte sein, dass Sie in (künstliche) Treiberauflösungsgrenzen geraten. Eine verrückte Sache wäre es, 4 Webgl-Kontexte in einer 2x2-Tabelle auszuführen und jeder davon mit einer angepassten Kamera zu rendern. Dies wird Ihnen 4x Api Overhead geben, aber vielleicht einige dumme Grenzen überspringen? – starmole

Antwort

7

Ich will nur ein Update für all jene, die diesen Beitrag einige Schließung gefolgt. Ich konnte meine Anwendung über 45 FPS laufen lassen, indem ich einfach die Canvas-Option "antialias: false" einstellte. Dies ergab einen enormen Leistungsgewinn bei Displays mit hoher Dichte und ist nicht notwendig, da Bildschirme mit hoher Dichte eine große Menge an eingebautem Antialiasing bereitstellen. Hoffe, das hilft jemandem in der Zukunft.

+0

Ich stieß auf das gleiche Problem und ich habe die Lösung, die die gleiche wie Ihre ist. Wenn ich deine Antwort früher lese, brauche ich nicht so viel Zeit, um die richtige Antwort zu finden. – jz1108

2

Einige Dinge sind in Chrome unter Mac OSx nicht hardwarebeschleunigt.

Werfen Sie einen Blick auf diese URL:

chrome://gpu/ 

Wenn Sie etwas finden, das deaktiviert ist, können Sie möglicherweise eine Einstellung mit:

chrome://flags/ 

Der Nachteil ist, dass, wenn Sie etwas finden, das funktioniert, ist es nicht genau einsetzbar. Es kann Ihnen Einblicke geben, wo Ihr Engpass jedoch ist.

(hier ist die vollständige Liste der URLs, die Sie zu versteckten und besondere Orte in Chrom erhalten: chrome://chrome-urls/)

+2

Ein hilfreicher Gedanke, aber es hilft nicht wirklich. Ich weiß bereits, dass der Flaschenhals in meiner Anwendung der Fragment-Shader ist. Die einzige Möglichkeit, Aufrufe des Fragment-Shaders zu reduzieren, besteht darin, meine Vertex-Anzahl zu reduzieren, was für mich keine gute Option ist. Schätzen Sie die Mühe! – aeskreis

0

hatte ich das gleiche Problem. Die Renderer-Option, die geholfen hat, war renderer.setPixelRatio (1); Fps ging von 40 bis 60 auf dem Macbook Pro. Drei js R86

Verwandte Themen