2012-04-11 8 views
0

Ich empfange eine Reihe von Bildern über eine Netzwerkverbindung und möchte sie so schnell wie möglich anzeigen, bis zu 30 FPS. Ich habe ein UIView-Objekt abgeleitet (so dass ich drawRect überschreiben kann) und eine UIImage-Eigenschaft namens cameraImage bereitgestellt. Die Rahmendaten kommen so schnell wie nötig an, aber die eigentliche Zeichnung auf dem Bildschirm benötigt viel zu viel Zeit (als Folge der Verzögerung von setNeedsDisplay), was zu Verzögerungen im Video führt und die Interaktion mit anderen Steuerelementen verlangsamt. Was ist ein besserer Weg, dies zu tun? Ich verwende OpenGL, aber die einzigen Beispiele, die ich gesehen habe, sind nicht das Zeichnen statischer Bilder auf dem Bildschirm, sondern das Hinzufügen von Texturen zu einem rotierenden Polygon.Stream von CGImage-Daten so schnell wie möglich anzeigen

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGRect screenBounds = [[UIScreen mainScreen] bounds]; 
    [self.cameraImage drawInRect:screenBounds]; 

    // Drawing code 
    //CGContextDrawImage(context, screenBounds, [self.cameraImage CGImage]); // Doesn't help 
} 

Antwort

3

Versuchen Sie, eine CALayer ‚s contents auf die Bildeinstellung. Oder, wenn Sie es mit relativ vernünftigen Parametern einrichten, sollte die Einstellung UIImageView 's image nicht viel langsamer sein.

OpenGL ist definitiv eine Alternative, aber es ist viel schwieriger zu arbeiten, und es wird immer noch durch die gleiche Sache wie die anderen begrenzt: die Textur Upload-Geschwindigkeit.

(Wie Sie es tun (Zeichnung in drawRect:), müssen Sie UIKit eine Bitmap für Sie zuweisen, dann das Bild in die Bitmap zeichnen, dann laden Sie die Bitmap auf die Video-Hardware Zwischenhändler und laden Sie das Bild direkt, wenn Sie können.)

Es kann auch davon abhängen, woher das CGImage kam. Wird es durch rohe Bitmap-Daten (und wenn ja, in welchem ​​Format?) Oder ist es ein JPEG oder PNG? Wenn das Bild formatiert oder decodiert werden muss, dauert es länger.

Wie groß ist das CGImage? Stellen Sie sicher, dass es nicht größer ist, als es sein muss!

+0

Das CGImage ist definitiv ein bisschen groß für einen iPad-Bildschirm, und ich sollte wirklich klarstellen und darauf hinweisen, dass es die Verwendung von setNeedsDisplay ist, die mich zu töten scheint. Also wird ein UIImageView das schnell aktualisieren? Ich hatte den Eindruck, das wäre bei weitem das Schlimmste. Danke für die Tipps! – ayrton04

+0

AFAIK Das Setzen eines 'UIImageView's Bildes läuft einfach darauf hinaus, den Inhalt seiner Ebene zu setzen - deshalb sollte man nicht 'UIImageView' ableiten und eine eigene Zeichnung machen, denn dann würde das Bild komplett überschrieben werden. Wie immer versuchen Sie es und sehen Sie. –

Verwandte Themen