So aktualisieren Sie Pixel direkt - mit CGImage und direktem CGDataProvider
Aktuelle Frage
Mehrere Antworten werden mein Problem lösen:
Kann ich einen erzwingen?CGImage
zum erneuten Laden der Daten von einem direkten Datenprovider (erstellt mitCGDataProviderCreateDirect
) mögenCGContextDrawImage
tut? Oder gibt es eine andere Möglichkeit, mich auf self.layer.contents einzustellen, um dies zu tun?Ist da einCGContext
Konfiguration oder Trick, mit dem ich 1024x768-Bilder mit mindestens 30 fps konsistent rendern kannCGContextDrawImage
.Hat jemand erfolgreich eingesetztCVOpenGLESTextureCacheCreateTextureFromImage
für Echtzeit-Puffer-Updates mit eigenen Texturdaten? Ich denke, mein größtes Problem ist die Schaffung einesCVImageBuffer
als ich die anderen Eigenschaften von Apples 'Dokumentation für Texturen kopierte. Wenn jemand mehr Informationen dazu hat, wäre das großartig.Alle anderen Richtlinien, wie ich ein Bild aus dem Speicher mit 30 fps auf den Bildschirm bringen kann.Hintergrund (Lose):
Ich arbeite an einem Projekt, bei dem ich die Pixel von NPOT-Bilddaten in Echtzeit (mindestens 30 fps) ändern und diese in iOS auf den Bildschirm zeichnen muss.
Mein erster Gedanke war, OpenGL mit zu verwendenglTexSubimage2D
Leider war das Update sehr langsam (6 fps auf dem iPad), da der Treiber bei jedem Frame meine RGB-Daten in BGR konvertiert. Also schick es in BGR, sagst du, und ich auch, aber aus irgendeinem Grund kannst du nicht anrufenglTexSubImage2D
mitGL_BGR
Stelle dir das vor. Ich weiß, dass eine gewisse Langsamkeit darauf zurückzuführen ist, dass es sich nicht um eine Potenz von 2 Bilddaten handelt, aber meine Anforderungen bestimmen dies.
Weiteres Lesen führte mich zuCVOpenGLESTextureCacheCreateTextureFromImage
In allen Beispielen wird jedoch ein direkter Kameraeingang verwendet, um eineCVImageBufferRef
Ich habe versucht, mithilfe der Dokumentation (noch keine offiziellen Kommentare in den Kopfzeilen) einen eigenen CVImageBuffer für meine Bilddaten zu erstellen, aber dies würde nicht funktionieren (keine Fehler, nur eine leere Textur im Debugger), weshalb ich denke, dass Apple dies speziell erstellt hat Echtzeitkameradaten zu verarbeiten, und es wurde nicht viel außerhalb dieses Bereichs getestet, sondern IDK.
Nachdem ich meine Würde aufgegeben hatte, indem ich OpenGL abgeladen und meine Gedanken auf CoreGraphics umgestellt hatte, wurde ich zu dieser Frage geführtschnellste weg, um einen bildschirmpuffer auf dem iphone zu zeichnen welches die Verwendung von a empfiehltCGImage
unterstützt vonCGDataProviderCreateDirect
, mit dem Sie einen Zeiger auf Bilddaten zurückgeben können, wenn das CGImage diesen benötigt, oder? Nun, es scheint nicht ganz so zu funktionieren, wie es angekündigt wurde. Wenn ich benutzeCGContextDrawImage
dann klappt alles. Ich kann den Pixelpuffer ändern und bei jeder Zeichnung werden die Bilddaten wie gewünscht von meinem Datenprovider angefordert, wobei die Methoden aufgerufen werdenCGDataProviderDirectCallbacks
(Note:
Sie scheinen eine eingebaute Optimierung zu haben, die den aktualisierten Zeiger ignoriert, wenn er die gleiche Adresse wie der durchlässige hat. CGContextDrawImage ist nicht superschnell (ca. 18 fps), auch wenn die Interpolation deaktiviert wurde, was zu einer Steigerung von 6 fps führte. Die Dokumente von Apple geben an, dass ich verwendeself.layer.contents
wird viel schneller sein alsCGContextDrawImage
. Verwendenself.layer.contents
funktioniert für die erste aufgabe aber dieCGImage
fordert vom Datenprovider niemals ein Reload wie das anCGContextDrawImage
tut, auch wenn ich anrufe[layer setNeedsDisplay]
. In der SO-Frage, auf die ich mich bezog, zeigt der Benutzer seine Lösung für das Problem, indem er in jedem Frame ein neues CGImage aus der Datenquelle erstellt und zerstört. Dies ist ein hoffnungslos langsamer Prozess (ja, ich habe es versucht), also Zeit für die eigentliche Frage.
Hinweis: Ich habe alle diese Vorgänge analysiert und weiß, dass das Problem wirklich bestehtglTexSubImage
für OpenGL undCGContextDrawImage
Ist wirklich das Problem von CoreGraphics, also gibt es keine "Go-Profil" -Antworten.
BEARBEITEN Quellcode, der diese Technik demonstriert, ist jetzt unter verfügbarhttp://github.com/narpas/image-sequence-streaming