Zuerst ein bisschen Kontext
Ich habe eine Xamarin App, die im Wesentlichen Video von einem Remote-Server streamt. Ich habe einen Hintergrund-Thread, der so loopt (Pseudocode):
%Vor%Ich starte den Hintergrund-Thread wie folgt:
%Vor%Das Problem
Wenn ich den Stream starte, ist alles perfekt. Es ist erst nach ~ 10 Sekunden nicht mit dem Gerät interagieren, dass es wirklich langsam wird. Ich habe die Anzahl der Updates vom Hintergrundthread ausgegeben und sie scheinen viel langsamer zu kommen. Ich bekomme normalerweise 2-6 Updates pro Update (60fps). Wenn es sehr langsam ist, bekomme ich 1 je 6 Update-Zyklus.
Eine Sache, die mich verwirrt: Wenn ich das iOS-Top-Bar-Menü herunterfahre, gehen die Updates wieder hoch und der Stream ist plötzlich wieder auf normale Geschwindigkeit eingestellt. Die Aktualisierungsrate erhöht sich für ~ 10 Sekunden und es kommt zurück, um wie verrückt nachzuhängen.
Was ich versucht habe
Ich habe versucht, eine Dispatch-Warteschlange mit nur diesem darin zu starten, wie folgt:
%Vor%Es schien überhaupt nicht zu helfen.
Ich habe auch versucht, die QualityOfService-Eigenschaft in meinem Update-Thread wie folgt zu ändern:
%Vor% Funktioniert auch nicht! Es scheint mir, dass iOS aus irgendeinem Grund die Priorität meines Threads senkt. Wenn ich einen Haltepunkt in meine UpdateMethod
-Methode setze, wird er getroffen, wenn die App nicht nacheilt. Aber wenn es eine Verzögerung gibt, wird der Breakpoint nicht getroffen. Jetzt verwirrt mich das wirklich, da der Code immer noch läuft! Ich bekomme immer noch die Updates, es ist einfach viel langsamer ...
Edit: Ich habe mit Instrumenten getestet und festgestellt, dass das Netzwerk gedrosselt wird ... Untersuchen, aber wenn jemand Kenntnis von irgendeiner Art von Netzwerkdrosselung auf iOS hat, lass es mich wissen.
Setze IdleTimerDisabled
auf true
, wir tun dies die ganze Zeit in iOS-Spielen, damit iOS nicht unsere Spiele im Leerlauf laufen lässt.
Hinweis: Wir machen das in polite way
nur dann, wenn der Benutzer den Bildschirm nicht berührt, weil er sich eine Wiederholung angesehen hat, Multimediawechsel geändert hat usw.
Hinweis: Stellen Sie sicher, dass Sie den Leerlauf zurücksetzen, wenn Sie ihn nicht benötigen (wenn Ihre App im Hintergrund läuft, usw.), weil Sie die Batterie entladen und die Benutzer über Ihre App auf die Echtheit stoßen Killer: Apple Store-Ablehnungen
Apple: Info zum App-Leerlauftimer
Xamarin: UIKit.UIApplication.IdleTimerDisabled-Eigenschaft
Der Standardwert dieser Eigenschaft ist NO. Wenn die meisten Apps für kurze Zeit keine Berührungen als Benutzereingaben haben, versetzt das System das Gerät in einen "Schlaf" -Zustand, in dem der Bildschirm abgedunkelt wird. Dies geschieht, um Strom zu sparen. Allerdings Apps, die keine Benutzereingaben haben B. die Beschleunigungsmesser-Spiele, kann durch Setzen dieser Eigenschaft auf YES den "Leerlauf-Timer" deaktivieren, um den Systemschlaf zu verhindern.
| WICHTIG
Sie sollten diese Eigenschaft nur dann setzen, wenn es notwendig ist. Stellen Sie sicher, dass Sie diese Eigenschaft auf NEIN zurücksetzen, wenn die Notwendigkeit nicht mehr besteht. Bei den meisten Apps sollte das System den Bildschirm ausschalten, wenn der Leerlauftimer abgelaufen ist. Dies beinhaltet Audio-Apps. Bei angemessener Nutzung der Audio Session Services werden Wiedergabe und Aufnahme ohne Unterbrechung fortgesetzt, wenn der Bildschirm ausgeschaltet wird. Die einzigen Apps, die den Leerlauftimer deaktivieren sollten, sind Apps, Spiele oder Programme, auf denen die App Inhalte weiterhin anzeigen muss, wenn die Benutzerinteraktion minimal ist.
Tags und Links c# multithreading ios xamarin.ios xamarin