UIView/CALayer Scaling-Performance-Problem am iPhone/iPod

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • UIView/CALayer Scaling-Performance-Problem am iPhone/iPod

    Hallo,

    meine App stellt einen Live-Graphen in Form eines Liniendiagrammes dar. Vereinfacht gesagt, es werden immer die Messwerte der letzten N Sekunden visualisiert. Der Benutzer kann per horizontaler Pinch-Gesture die Skalierung der x-Achse ändern und somit das dargestellte Intervall erhöhen oder reduzieren, oder per vertikaler Pinch-Gesture die Skalierung auf der y-Achse ändern, jeweils nur bis zu einem gewissen Maximum. Dabei kann es aber trotzdem passieren, dass ca. 25000 Messwerte gleichzeitig dargestellt werden müssen. Die Messwerte treffen sonst an sich zeitlich sequentiell ein. Zum Darstellen verwende ich einen eigenen UIView, mit eigenen CALayern, die ich mit Quartz 2D zeichne. Zwar ist es kein Problem, den Graphen laufend zu aktualisieren und so die bis zu 25000 Messwerte darzustellen, denn ich zeichne nur die neuen Punkte und buffere die vergangenen in CGLayern. Beim Skalieren hingegen, bekomm ich mit meinem bisherigen, "naiven" Ansatz allerdings Performance-Probleme. Derzeit wird der gesamte Graph einfach neu gezeichnet.

    Folgende Lösungsmöglichkeiten hab ich mir bereits überlegt:

    *) Reduktion der angezeigten Daten während eines Pinches und nur diese mit dem neuen Scale-Faktor neu zeichnen. Nach abgeschlossenem Pinch, zeichne ich den Graphen in höchster Detailstufe neu. Würde zwar performant laufen, allerdings bekäme ich während des Pinches Aliasing-Effekte rein. Peaks würden geglättet, oder sogar verschwinden.
    *) CGAffineTransformMakeScale auf transform-Property anwenden und abschließend wiederum mit neuem Scale-Faktor neu zeichnen. So macht es ja die Photo-App? Die Variante funktioniert zwar bei einem y-Scaling ganz gut, allerdings bei x-Scaling eher weniger. Es sei denn, ich rendere den Graphen immer vorher bei höchster Detailstufe in einem CGLayer. Mach ich das nicht, bekäme ich auch wieder Aliasing-Effekte rein, teils sogar noch gröbere als bei der vorhergehenden Variante.

    Bin sehr unentschlossen und weiß gerade nicht, welchen Weg ich einschlagen soll. Vielleicht hilft Open GL ES bei dem Problem, allerdings hab ich noch gar keine Erfahrungen damit. Da das Einarbeiten sehr lange dauert, wollte ich vorher fragen, ob es bei dem Problem überhaupt Sinn macht? Vielleicht sollte ich mir Cocos 2D zu Gemüte führen, oder habt ihr eine andere Idee? Wäre für jede Hilfe sehr dankbar.

    Viele Grüße!