Sprite Kit Schwerwiegendes FPS-Problem im Vollbildmodus unter OS X

8

Ich mache ein ziemlich komplexes Sprite-Kit-Spiel. Ich habe vor kurzem Unterstützung für OS X hinzugefügt. Ich bekomme immer 60 fps, egal wie mein Spiel skaliert wird, wenn das Fenster in der Größe geändert wird (auch wenn die Größe auf den maximalen Bildschirmplatz geändert wurde). In dem Moment, in dem ich meine App "Full Screen" eingebe, fällt die FPS auf 30-40 fps und bleibt so? Aber wenn ich meinen Mauszeiger nehme und die Menüleiste freigebe, während der Vollbildmodus aktiviert ist, werden die fps wieder auf 60 fps hochgefahren!

Sie können diesen Fehler sogar testen, indem Sie ein Sprite-Kit-Spiel für Mac in Xcode mit der Standardvorlage erstellen. Hier sind die Screenshots, die ich von der Standard-Spielvorlage für Mac gemacht habe.

Ich schlage vor, es selbst auszuprobieren, Sie müssen nicht einmal Code schreiben, wenn Sie Apples Standard-Sprite-Kit-Vorlage für OS X verwenden.

Maximales Fenster (keine FPS-Probleme: 59-60 FPS)

Vollbildmodus (FPS fällt auf 30-40 FPS)

Vollbildmodus mit Maus im oberen Bereich der Menüleiste (Überraschenderweise KEINE FPS-Probleme: 59-60 FPS)

Jeder hat eine Idee, was dieses Problem verursachen könnte. Ich möchte meine App nicht im Vollbildmodus veröffentlichen, wenn dies bedeutet, dass Nutzer die Leistung verlieren. Man könnte meinen, der Vollbildmodus könnte das Zeichnen besser optimieren, aber anscheinend ist es genau das Gegenteil. Ich mache das auf Yosemite.

    
Epic Byte 03.01.2015, 18:17
quelle

3 Antworten

7

Ok, nach einigen Wochen, in denen ich dieses Problem untersucht habe, habe ich einige Problemumgehungen für dieses Problem gefunden. Bevor ich anfange, möchte ich zunächst mein Setup erklären. Ich verwende einen NSViewController in einem Storyboard, das ein SKView enthält. Ich habe die Problemumgehung auf dem MacBook Pro getestet (Retina, 15 Zoll, Anfang 2013), habe ich keine Ahnung, ob die Abhilfen ich unten präsentiert auf anderen Macs arbeiten. Ich glaube es sollte, wenn ich die Chance bekomme, werde ich testen und sehen, ob die Workarounds unten funktionieren.

Bevor ich beginne, wollen wir noch einmal zusammenfassen, was das Problem ist. Das Problem besteht darin, dass durch das Klicken auf die Schaltfläche "Vollbild" die App in den Vollbildmodus geschaltet wird, was zu einem massiven Rückgang von FPS führt. Unten ist, wie Sie die Vollbild-Taste aktivieren:

%Vor%

Also habe ich nach einer anderen Möglichkeit gesucht, mit diesem Code in den Vollbildmodus zu gelangen:

%Vor%

Aber ich hatte immer noch einen massiven Rückgang der FPS. Denken Sie daran, ich hatte keine Probleme mit fps im maximierten Fenstermodus oder sogar im Vollbildmodus mit der Menüleiste! (siehe Bilder in Frage).

Also habe ich versucht, den Einstieg in den Vollbildmodus zu umgehen. Ich fand eine Führung von Apple hier

einen Teil des Codes aus der Führung Verwendung schaffte ich Vollbild-Eingabe durch die Fenstergröße auf die Größe des Displays einstellen, und die Positionierung des Fensters vor allem OS X-Benutzeroberfläche. Der Code dafür lautet wie folgt:

%Vor%

Aber, leider, das selbe Problem ... Die FPS ist gerade wie vorher gefallen.

Also dachte ich mir was, wenn ich mich mit der Größe / Position des Fensters beschäftige. Also habe ich versucht, das Fenster nach unten zu bewegen, so dass nur die Menüleiste sichtbar war, wie unten gezeigt. UND DAS GEARBEITET. Ich hatte keinen Rückgang der fps mehr. Aber offensichtlich ist es nicht wirklich Vollbild, weil die Menüleiste sichtbar ist

%Vor%

Es stellt sich heraus, dass die Anpassung der Fenstergröße um 1 Punkt den Rückgang der fps verringert. So des Fehler muss zu einer Optimierung in Beziehung gesetzt werden (wie ironisch) Apfel tut, wenn Ihre Fenstergröße die Bildschirmgröße entspricht.

Glauben Sie mir nicht? Hier ist ein Zitat aus dem Link.

  

OS X v10.6 und höher optimieren automatisch die Leistung von    bildschirmgroße Fenster

Um das Problem zu beheben, müssen wir lediglich unsere Fenstergröße um einen Punkt vergrößern, damit OS X nicht versucht, unser Fenster zu optimieren. Dadurch wird Ihre App auf der Oberseite leicht abgeschnitten, aber 1 Pixel sollte überhaupt nicht wahrnehmbar sein. Und im schlimmsten Fall könnten Sie Ihre Knotenposition um 1 Punkt anpassen, um dies zu berücksichtigen.

Im Folgenden finden Sie zwei Problemumgehungen. Beide Problemumgehungen verursachen keinen Rückgang von FPS. Ihre App sollte genau wie im maximierten Fenstermodus funktionieren. Die erste Problemumgehung bringt Ihre App in den Vollbildmodus und zeigt die Menüleiste ganz oben an. Mit der zweiten Problemumgehung wird Ihre App im Vollbildmodus ohne Menüleiste angezeigt.

Workaround 1: Vollbild mit Menüleiste

%Vor%

Workaround 2: Vollbild ohne Menüleiste

%Vor%

Wenn diese Problemumgehungen aus irgendeinem Grund nicht funktionieren, versuchen Sie, etwas mehr mit der Größe / Position des Fensters zu tun. Möglicherweise müssen Sie auch die Fensterebene ändern, je nachdem, ob Sie andere Ansichten haben, z. B. Dialoge, die Ihre App nicht überlappen sollte. Denken Sie auch daran, Fehlerberichte mit Apple einzureichen.


Zusätzliche Informationen über NSBorderlessWindowMask

Diese Problemumgehungen verwenden eine NSBorderlessWindowMask. Diese Art von Fenstern akzeptiert keine Tastatureingabe, wenn sich das Schlüsselfenster ändert. Wenn Ihr Spiel Tastatureingaben verwendet, sollten Sie Folgendes überschreiben. Siehe hier

%Vor%

Update: Einige schlechte Nachrichten

Getestet diese Abhilfe auf Mac Book Air, und es hat nicht funktioniert, es sei denn etwa 100 Punkte abgezogen wurden (was natürlich sehr auffällig ist). Ich habe keine Idee warum. Gleiches gilt für die Lösung von andyvn22. Ich habe auch bemerkt, dass sehr selten, vielleicht einmal alle 60 Starts die vorgesehenen Workarounds einfach nicht auf dem Mac Book Air funktionieren. Und die einzige Möglichkeit, das Problem zu beheben, ist ein Neustart der App. Vielleicht ist das Max Book Air ein Sonderfall. Vielleicht hat das Fehlen einer Grafikkarte mit dem Problem zu tun. Hoffentlich wird Apple das Problem aussortiert. Ich bin jetzt hin- und hergerissen zwischen der Unterstützung von Vollbild und nicht unterstützt Vollbild. Ich möchte wirklich, dass Benutzer in den Vollbildmodus wechseln können, aber gleichzeitig möchte ich nicht riskieren, dass Benutzer die Hälfte ihres FPS verlieren.

    
Epic Byte 02.04.2015, 17:59
quelle
3

Basierend auf der sehr hilfreichen Arbeit von Epic Byte fand ich eine noch einfachere Möglichkeit, Apples Vollbild "Optimierung" zu deaktivieren. Sie können weiterhin die Vollbildfunktion von OS X verwenden. Alles, was Sie tun müssen, ist die folgende Methode im Delegaten Ihres Fensters zu implementieren:

%Vor%

Leider scheint das Hinzufügen eines Pixels nicht so zu funktionieren, sondern nur eines, so dass Sie eine Zeile Bildschirmplatz verlieren. Es lohnt sich jedoch, die integrierte Vollbildfunktion weiterhin zu verwenden, insbesondere während ich darauf warte, dass Apple seinen Optimierungsfehler behebt.

    
andyvn22 05.04.2015 02:42
quelle
0

Ich glaube, dass dieses Problem bei allen Apps auftritt, die OpenGL zum Rendern verwenden. MPV (Video-Player) mit der folgenden Video-Konfiguration hat die gleichen Probleme: vo = opengl hwdec = no

CPU-Nutzung - Fenster: durchschnittlich 42%

CPU-Nutzung - Vollbild (nativ): 62%

CPU-Nutzung - Vollbild (nicht nativ / in App): 60%

CPU-Nutzung - Vollbild (nativ mit Menüleiste): 45%

CPU-Nutzung - Offscreen (mit nativem Vollbild): 95%

Dies tritt auch bei PPSSPP mit OpenGL-Backend auf, außer mit erhöhter GPU anstelle von CPU-Nutzung:

Gpu-Nutzung - Fenster: durchschnittlich 20%

Gpu-Nutzung - Vollbild (mit Menüleiste): 20%

Gpu-Nutzung - Vollbild (nativ): 35%

Gpu-Nutzung - Offscreen (mit nativem Vollbild): 90%

Dieses Problem scheint jedoch nicht aufzutreten, wenn Entwickler ihren eigenen "Spezial" -Fullscreen implementieren. Im Fall von Enter the Gungeon, wo CPU-Nutzung und GPU-Nutzung keinen Unterschied zwischen Fenster und FS zeigt. Obwohl ich noch keine Zeit hatte zu überprüfen, wie sie Fullscreen implementiert haben.

Getestet auf MBP Late 2015 13 'auf OSX 10.11.6

Die leicht erhöhte Nutzung im Vollbildmodus ist ein wenig nervig, wie Sie gesagt haben und kann Framedrops verursachen, aber was mich am meisten beunruhigt, ist die fast 100% ige Nutzung von CPU und GPU in OpenGL-Anwendungen im Hintergrund. (Anmerkung: Es ist 90% auf ppsspp, egal was es tut, auch wenn es pausiert).

    
kokowang 24.07.2016 05:30
quelle

Tags und Links