Wie kann ich den Bildschirm mit akzeptabler Leistung aufzeichnen, während die Benutzeroberfläche ansprechbar bleibt?

Ich suche Hilfe bei einem Leistungsproblem in einer Objective-C-basierten iOS-App.

Ich habe eine iOS-Anwendung, die den Bildschirminhalt mithilfe der renderInContext-Methode von CALayer erfasst. Es wird versucht, genügend Bildschirmbilder aufzunehmen, um mit AVFoundation ein Video zu erstellen. Die Bildschirmaufnahme wird dann mit anderen Elementen zu Forschungszwecken zur Benutzerfreundlichkeit kombiniert. Während der Bildschirmaufnahme zeigt die App möglicherweise auch den Inhalt einer UIWebView an, geht über das Netzwerk, um Daten abzurufen usw. Der Inhalt der Webansicht unterliegt nicht meiner Kontrolle - es handelt sich um willkürlichen Inhalt von Netz.

Dieses Setup funktioniert, aber wie Sie sich vorstellen können, ist es nicht butterweich. Da die Ebene im Hauptthread gerendert werden muss, gibt es mehr UI-Konflikte als ich möchte. Ich möchte ein Setup haben, bei dem die Reaktionsfähigkeit der Benutzeroberfläche Vorrang vor der Bildschirmaufnahme hat. Wenn der Benutzer beispielsweise in der Webansicht einen Bildlauf durchführt, möchte er lieber Frames auf der Aufnahme ablegen, als ein schreckliches Bildlauferlebnis zu haben.

Ich habe mit verschiedenen Techniken experimentiert, von der Zusammenführung von dispatch_source bis zur Übermittlung der Frame-Capture-Anforderungen als Blöcke an die Hauptwarteschlange von CADisplayLink. Bisher scheinen sie alle in etwa gleich zu sein. Die Einzelbildaufnahme wird derzeit in drawRect der Hauptansicht des Bildschirms ausgelöst.

Was ich hier frage, ist: Welche Techniken schlagen Sie vor, um meine Ziele zu erreichen? Ich realisiere, dass die Antwort vielleicht ist, dass es keine gute Antwort gibt ... aber ich möchte alles versuchen, wie verrückt es auch klingen mag.

HINWEIS: Welche Techniken auch immer für den App Store geeignet sein müssen. Ich kann nicht so etwas wie den CoreSurface-Hack verwenden, den Display Recorder verwendet.

Danke für Ihre Hilfe!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage