1

Ich beschäftige mich gerade ein bisschen mit dem iPhone SDK. In UIView gibt es ja diese -drawRect Methode. Damit kann man direkt im View zeichnen. Mir hat ein Kollege erzählt das es besser ist in -drawRect zu zeichnen anstatt mehrere Subviews in ein UIView einzubauen. Aber wieso genau wusste er auch nicht. Bisher hat das mit Subviews prima geklappt. Wieso sollte ich -drawRect nehmen?

flag

1 Answer

1

In -drawRect: zu zeichnen anstatt Subviews zu erzeugen hat den Zweck, die Performance zu erhöhen und den Speicherverbrauch zu reduzieren. Allerdings hängt es stark davon ab, was erreicht werden soll. Dafür ist ein wenig Hintergrundwissen erforderlich:

Was ist ein UIView? Jedes UIView besitzt ein CALayer Objekt. Das CALayer Objekt ist mit einer Bitmap assoziiert, welche den Content des Layers repräsentiert. Diese Bitmap benötigt wertvollen Speicher. Darüber hinaus wird diese Bitmap zweimal kopiert.

Was passiert, wenn Subviews erzeugt werden? Der Composer in iPhone OS geht den Layer Tree (ein Baum, in dem alle CALayer und deren Bitmaps hierarchisch angeordnet sind) durch und berechnet die Komposition der Subview-Bitmaps. Aus diesen entsteht zusammen mit dem eigenen -drawRect: Code des Superviews eine Bitmap, welche den sichtbaren Content des Views im RGBA Farbraum repräsentiert. Dies ist ungefähr so als würde jemand ein paar Bilder nehmen, in Photoshop oder Gimp öffnen und mit mehreren Layern auf einer Arbeitsfläche platzieren. Das Compositing ist eine sehr teure Operation. Kostet Performance und Energie. Besonders wenn der Alphakanal ins Spiel kommt und Views nicht als opaque (=undurchsichtig) markiert sind, hat das System viel zu tun. Je tiefer die View-Hierarchie, desto komplexer werden diese Berechnungen.

Welche Vorteile habe ich, wenn ich keine Subviews erzeuge sondern deren Content direkt in das Superview zeichne?

  • Der Composer muss weniger rechnen
  • Es werden keine überflüssigen Bitmaps im Speicher vorrätig gehalten
  • Das View kann wesentlich schneller gezeichnet werden

Welche Nachteile habe ich, wenn ich das tue? Die Subviews, die dann ja keine mehr sind, können nicht mehr einzeln mit UIView Animation animiert werden. Sollen einzelne Inhalte eines Views animiert werden, muss auf komplexere Animationstechniken zurückgegriffen werden (z.B. sequentiell einzelne Ausschnitte in -drawRect: neuzeichnen lassen), oder es werden Subviews notwendig. Das View selbst kann weiterhin mit UIView Animation (high level) und Core Animation (low level) animiert werden.

Zusammenfassung: Sollen Subviews auf einfache Art und Weise animierbar sein, oder sollen einzelne Inhalte wie z.B. Texte leicht geändert werden können, Subviews verwenden. Ist dies nicht erforderlich, können die Inhalte in -drawRect: direkt gezeichnet werden, um Rechenzeit und Speicherplatz zu sparen.

link|flag

Your Answer

Get an OpenID
or

Not the answer you're looking for? Browse other questions tagged or ask your own question.