Ich arbeite an einem sehr einfachen vertikalen Scroll-Spiel für Unity iOS. Mein Spiel hat inkonsistente Jitter. Ich habe das Internet ausgiebig gesucht, ohne Glück zu suchen. Ich verwende Unity Version 5.3.4 f1.
Das Spiel
Update()
( Time.deltaTime
wird multipliziert) zu verschieben. LateUpdate()
(mit Vector3.Lerp()
folgt). Das Problem
Was wir versucht haben
Update()
, LateUpdate()
, FixedUpdate()
, Time.deltaTime
Time.smoothDeltaTime
, Lerp ausprobiert, um die Szene auf ein paar Würfel zu reduzieren und alle Collider und Trigger zu entfernen. Ich habe keine Ideen mehr. Jede Hilfe oder Zeiger wird sehr geschätzt.
Vielen Dank im Voraus.
Dies könnte durch viele verschiedene Gründe verursacht werden, und ohne Code zu sehen, kann ich nur einige Vorschläge machen, die mir einfallen:
1. Float Point Genauigkeit Fehler
Das würde auf einen Gleitkomma-Präzisionsfehler hinweisen. Anstatt das Zeichen fallen zu lassen, bewegen Sie die Objekte um das Zeichen von unterhalb der Bildschirmansicht zur oberen Bildschirmansicht, so dass alles in der Nähe des Ursprungs auftritt.
2. Häufig Instanziierung oder andere Verzögerungsspitzen
for
/ foreach
/ while
Schleifen? Das Instanziieren führt zu einem Lag-Spike und einem Garabage-Effekt, der dazu führt, dass der Garbage Collector häufiger ausgeführt wird. Da die Framerate fest ist, sehen Sie bei einem langsamen Vorgang etwas Jitter.
Anstatt Objekte zu instanzieren und zu zerstören, wenn der Spieler eine gewisse Distanz zurücklegt, sollten Sie Instantiate
einen Pool von GameObjects nach dem Laden der Szene mit gameObject.SetActive(false)
inaktiv machen und sie in einer Liste, einem Array usw. speichern Wenn Sie Instatiate
ein neues Objekt benötigen, nehmen Sie einfach eines aus dem Pool und ändern Sie es in Transform.position
und gameObject.SetActive(true)
, wenn es benötigt wird.
3. Müllsammler läuft oft
Dies ist wahrscheinlich kein Problem, aber ich erwähne es immer noch. Nimm diesen Beispielcode:
%Vor% Jedes Mal, wenn Update
ausgeführt wird, erstellt es neue Variablen und weist ihnen Speicher zu. Nächstes Mal Update runs, it creates new variables, and allocates more memory. Eventually, the memory usage sets off the garbage collector, which goes around and frees up the memory used by all the previous
Update 'Funktionen. Stattdessen sollten Sie den Speicher am Anfang zuweisen und dann die Variablen wiederverwenden.
Um dies zu diagnostizieren, müssen Sie den Profil-Debugger anhängen und beobachten, ob der Jitter mit dem Garbage Collector konsistent ist.
Hoffentlich hilft dir hier etwas. Die beste Wahl für die Suche nach der Quelle des Jitters ist die Verwendung des Profilers. Hier ist die Anleitung für iOS:
Verbinden Sie Ihr iOS-Gerät mit Ihrem WiFi-Netzwerk (lokales / adhoc WiFi-Netzwerk) wird vom Profiler verwendet, um Profiling-Daten vom Gerät an Unity zu senden Editor). Aktivieren Sie das Kontrollkästchen "Autoconnect Profiler" im Unity-Build Einstellungsdialog Verbinden Sie Ihr Gerät per Kabel mit Ihrem Mac, überprüfen Sie die "Development Build" -Kontrollkästchen im Unity-Dialogfeld für die Build-Einstellungen und drücken Sie "Bauen & amp; Ausführen "im Unity Editor. Wenn die App auf dem Gerät startet, öffnen Sie sie Profilerfenster im Unity Editor (Window- & gt; Profiler).
Weitere Informationen: Das Profiler-Fenster
Vielen Dank für Ihre Zeit.
Nach weiteren Recherchen bin ich auf ein BLOG POST , diese Leute standen vor einem ähnlichen Problem und die Lösung funktioniert in meinem Szenario.
Kurz gesagt, das Problem bestand darin, dass der Einheitsrahmen nicht mit der Rahmenzeichnungsrate des Geräts synchronisiert wurde. Wenn Unity zum Rendern des Frames etwas länger braucht, wartet die Geräte-Rendering-Schleife nicht auf das Ende der Einheit und zeichnet einen leeren Frame, was zu Jitter führt. Aber, wie ich im Titel des Posts "Inconsistent Jitter" gesagt habe, berichtet das Blog auch das selbe und so passiert es nicht die ganze Zeit.
Woher weißt du, dass es das gleiche Problem ist? Nun, Sie sehen Render
Spikes im Profiler (obwohl wir sehr minimalistische Geometrie hatten). Es sieht eher so aus, als ob der Render verrückt wird.
Obwohl es im Blog mehr darum geht, Input zu verzögern, half es auch in meinem Szenario. Einige mögen nicht verstehen, wie genau ich dieses Problem lösen soll. Ich empfehle diesen POST , der eine sehr klare Lösung darstellt.
Beginnen Sie zu lesen, wenn der Benutzer "cgJames" in das KONVERSATION .
Ich hoffe, das hilft auch anderen.
Ich habe in letzter Zeit über das gleiche Problem gestolpert. Genau ... Ein vertikaler Scroller in Unity mit einfachen Grafiken, der nur bei iOS eine inkonsistente Framerate aufweist, manchmal vielleicht im Zusammenhang mit der Eingabe, vielleicht nicht.
Wie auch immer, ich habe endlich herausgefunden, woher das Problem kommt. Versuchen Sie, die Rendering-Engine auf iOS von Metal zu OpenGL ES 2 oder 3 zu ändern.
Hoffe das löst auch dein Problem.