Im SceneKit-Startprojekt werden sehr inkonsistente Bildraten angezeigt. Manchmal läuft es konstant bei 60 fps (12ms Rendering, 6ms Metal Flush), und manchmal läuft es konstant bei 40 fps (20ms Rendering, 6ms Metal Flush), nicht mehr und nicht weniger.
Die Bildrate ändert sich zufällig, wenn ich die App erneut öffne, und bleibt bei dieser Bildrate bis zum nächsten erneuten Öffnen. Ich habe versucht, zu OpenGL ES zu wechseln, und obwohl es scheint, es im Starter-Projekt zu beheben, sehe ich immer noch diese Tropfen in meiner realen App.
Das Starterprojekt ist nicht modifiziert (rotierendes Schiff), und ich teste es auf Xcode 7.0 und iPad Mini 4 mit iOS 9.0.1. Ich bin mir nicht sicher, was das Problem verursacht, SceneKit, iOS oder mein Gerät.
Edit: Hier ist eine Metall-System-Trace, der erste Teil, der es mit 60fps lief, der zweite Teil, den ich die Home-Taste drücke und die App erneut öffne, und es läuft mit 40fps. Es sieht so aus, als ob im zweiten Teil eine Menge Farbspeicher vorhanden ist.
Leider sieht es so aus, als ob SceneKit (und SpriteKit) sich in evolutionären Entwicklungsstadien befinden, auf Kosten derer, die sie benutzen.
Dieses Problem ist definitiv auf allen Geräten und den folgenden Frameworks, die ich kenne:
Auch wenn OpenGL anstelle von Metal in den Spiel-Frameworks verwendet wird, besteht das Problem immer noch, nicht weniger konsistent.
Es scheint ein Versuch von iOS zu sein, die Framerate auf 40 fps zu fixieren, wenn iOS feststellt, dass es ein Problem gibt, das stabile 60 fps beibehält.
Ich denke, die Ursache für den Rückgang auf 40 fps ist, dass iOS nicht sehr gut darin ist, "Probleme" zu interpretieren und Performance-Sampling über einen zu kurzen Zeitraum an einem instabilen Punkt des App-Starts durchzuführen, da viele falsche Ergebnisse vorliegen gibt es nicht mal da iOS selbst sich tatsächlich eingelebt hat und die App / das Spiel ungehindert laufen lässt.
Die Standardvorlage mit dem JetFighter sollte nie Probleme mit 60 fps haben. Es macht also nur Sinn, dass dieses "Framerate-Cap" -Feature aktiv wird, wenn das Abrufen durch iOS, um zu bestimmen, wann die Spielschleife bei 40 fps begrenzt werden soll, zu früh im Start erfolgt, zu kurz. Das bedeutet, dass jede Unterbrechung in den ersten Frames des Spiels dazu führt, dass iOS es auf 40 fps begrenzt, was vorbeugend ist, dass das Spiel 60 fps nicht halten kann / kann.
Ironischerweise ist iOS wahrscheinlich der Grund für die Schluckauf, die es beim Start des Spiels entdeckt, die dann dazu führen, dass die App nicht in der Lage ist, stabile 60 fps aufrechtzuerhalten.
ABER ICH SPECULIERE!
Dies basiert auf Beobachtung, keine bekannten Fakten in dieser Angelegenheit. Aber es stimmt mit dem überein, was ich gerade sehe und die einzige vernünftige Erklärung, die ich bis jetzt habe.
Die "gute Nachricht" ist, dass iOS nicht nur einmal sticht und es verlässt. Es nimmt das Spiel krampfhaft auf und springt nach Unterbrechungen auf den Startbildschirm und zurück in die App.
Zum Beispiel: Es ist möglich, ein Resampling der Framerate von iOS zu verursachen und es von 40 auf 60 oder 60 zu 40 zu springen, indem einfach Quicktime screenCapture gestartet wird, während das Gerät verbunden ist. Anscheinend wird dies (und ein paar andere Aktionen) dazu führen, dass iOS die laufende App auf ihre Framerate-Konsistenz testet, wiederum, dann passt iOS wieder entsprechend seinen Ergebnissen an.
Und nach einer willkürlichen Zeitspanne scannt es erneut. Wenn Sie das JetFighter-Template für eine Weile laufen lassen, werden Sie feststellen, dass iOS irgendwann einen weiteren Test der Framerate-Konsistenz durchführt und feststellt, dass es nun stabil bei 60 fps ist, um es trotz der ersten Entscheidung auf 60 fps hochzusetzen sollte nur bei 40fps laufen.
Ich sage das alles, weil ich in den Statistiken auf dem Gerät eine Sache namens "Renderer" gesehen habe, die absichtlich genau die richtige Menge an zusätzlicher Zeit in jeder Gameloop nimmt, um 40 fps zu erzwingen, selbst wenn es nicht annähernd genug andere Dinge gibt Gehen Sie weiter, um das notwendig zu machen.
Mir fällt ein, dass Apple an der variablen Frameraten-Technologie nach ihren Aussagen über das iPad Pro arbeitet, und die iOS-Funktionen unterstützen, die vor der Veröffentlichung der Bildschirmtechnologie (scheinbar) implementiert wurden, und zwar schlecht und Seltsame Tests laufender Apps, um festzustellen, wann sie zwangsweise auf langsamere Bildraten heruntergerollt werden müssen.
Da 40fps eine ungerade Zahl ist, die sich nicht gleichmäßig auf die Standardaktualisierungsrate der aktuellen Geräte bei ihrer 60fps-Bildwiederholfrequenz einteilt, ist das iPad Pro wahrscheinlich 120Hz Bildschirmauffrischung, wenn sie an 40fps interessiert sind.
>Wenn Sie von aktuellen iPads aufnehmen, wenn die Framerate bei 40fps von iOS gesperrt ist, sehe ich eine 2: 1: 2: 1: 2: 1 Frame-Sequenz, so dass Sie 40fps auf einem 60Hz Refreshing-Gerät machen würden. p>
Was in keiner Weise ideal ist. Sie würden das nie auf einem 60Hz Bildschirm sehen wollen, weil es visuell nervt, sogar für Leute mit unempfindlichen Augen.
Möglicherweise erlaubt diese variable Framerate-Technologie wahre 40 fps auf den neuen iPhones, ich weiß es nicht. Hab noch nichts getestet gesehen, aber es scheint merkwürdig, dass etwas, das nur wirklich möglich ist, auf dem iPad Pro dieses Problem in allem zur Zeit verursacht.