Ich erstelle eine einfache Farbauswahl, die von einem benutzerdefinierten Schieberegler gesteuert wird.Wie optimierst du UIColor auf dem iPhone?
Ich übermittle einen Gleitkommawert von meinem Schieberegler an eine UIColor-Konstruktormethode und aktualisiere die Hintergrundfarbe eines CALayers, wenn sich der Wert ändert.
Es läuft sehr flüssig im Simulator, aber ich bekomme eine Menge Flimmern beim Laufen auf dem Gerät.
Ist das nur, weil es die GPU überfordert? Es ist seltsamerweise das Schlimmste, wenn man sich durch Blau bewegt. Und das Ändern des Alpha-Wertes und der Helligkeit flimmert mehr als das Ändern der Sättigung und des Farbtons.
Sollte ich keine Gleitkommawerte übergeben, wenn sich der Wert des Schiebereglers ändert? Wenn nicht, wie könnte ich dies auf weniger Farben für die Optimierung beschränken?
Ich dachte, implizite Animationen für die backgroundColor-Eigenschaft des CALayer deaktivieren, aber ich bin mir nicht sicher, wie dies zu tun ist.
Gibt es Tricks zur Optimierung von UIColor-Änderungen?
aktualisieren
Ich verwende drawRect nicht: oder drawInRect:
ich die Backgroundcolor-Eigenschaft eines CALayer bin nur zu ändern. Jedes Mal, wenn touchesMoved: aufgerufen wird, schnappe ich mir den Ort, erstelle einen float-Wert von 0.0 bis 1.0 und übergebe meinem Delegaten eine Nachricht, dass sich der Wert geändert hat, und rufe die - (void) updateCurrentColor-Methode auf.
Hier ist ein Beispiel für meine Implementierung:
@implementation MyCustomSliderView
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
hueLocation = [[touches anyObject] locationInView:self];
//Smoothing
if ((hueLocation.x > previousHueLocation.x) && ((hueLocation.x - previousHueLocation.x) > 1.0) && (hueLocation.x - previousHueLocation.x) < 10.0) {
hueLocation.x = previousHueLocation.x + 1.0;
}
if ((hueLocation.x < previousHueLocation.x) && ((previousHueLocation.x - hueLocation.x) > 1.0) && (previousHueLocation.x - hueLocation.x) < 10.0) {
hueLocation.x = previousHueLocation.x - 1.0;
}
//Percentage of screen.
hueValue = hueLocation.x/self.bounds.size.width;
//Clip to 1.0 & 0.0
if (hueValue > 1.0) {
hueValue = 1.0;
}
if (hueValue < 0.0) {
hueValue = 0.0;
}
NSLog(@"Value is: %f", hueValue);
NSLog(@"Location %f", hueLocation.x);
previousHueLocation = hueLocation;
if([delegate respondsToSelector:@selector(updateCurrentColor)]) {
[delegate updateCurrentColor];
}
}
@implementation MyViewController
- (void)updateCurrentColor {
currentColor = [UIColor colorWithHue:hueSliderView.hueValue
saturation:saturationSliderView.saturationValue
brightness:brightnessSliderView.brightnessValue
alpha:alphaSliderView.alphaValue];
colorLayer.backgroundColor = currentColor.CGColor;
}
Zuerst dachte ich, dass es Werte aufgrund der Ungenauigkeit der Touch-Oberfläche zu springen. Die Glättungsfunktion hat geholfen, aber es flackert immer noch etwas, besonders mit dem Alpha-Wert, auch wenn sich mein Standort nur um 1 Pixel ändert. Sollte ich dies auf eine begrenzte Anzahl von Farben/Werten beschränken, anstatt nur einen beliebigen Float zu übergeben? Auch das läuft super im Simulator, scheint nur ein Performance-Problem zu sein.
Beschreiben Sie den Effekt, den Sie erhalten. Gibt es sichtbare vertikale/horizontale "Balken", an denen die Änderung sichtbar ist? Verschwinden Elemente vorübergehend? Erhalten Sie eine sichtbare, aber unerwünschte Übergangsfarbe? – Artelius
Keine Balken. Die Farbe flackert hell und dunkel, wenn ich die Werte (Farbton, Sättigung, Helligkeit, Alpha) ändere. Wenn ich wirklich langsam gehe, ist es besser, aber manchmal flimmert es trotzdem. Ich habe die Methode touchesMoved so angepasst, dass nur ein Pixel nach dem anderen bewegt wurde, es sei denn, es wurde über 15 verschoben. Das half. Flackert trotzdem. –