Je travaille sur un effet graphique pour une application iPhone qui simule un effet plasma à basse résolution à partir d'anciens jours demoscene. J'ai 600 cases à l'écran qui sont mises à jour aussi vite que possible. Depuis que j'utilise CoreGraphics (pour l'instant), je peux obtenir un 11FPS très constant sans gel -Qu'est-ce qui rend l'accès à NSArray si lent?
MAIS lorsque j'essaie d'ajouter une simple recherche NSArray, l'iPhone ainsi que le simulateur se fige pendant quelques secondes à quelques reprises secondes. J'ai exécuté ceci dans des instruments et il dit qu'il y a une fuite - la fuite doit faire avec NSAutoReleasePool, mais cela n'aide pas vraiment. (Je crée un NSAutoReleasePool au début de chaque mise à jour et je vidange le pool à la fin.)
En procédant par élimination, j'ai pu réduire le nombre de lignes à la ligne qui cause le ralentissement. Cette ligne se produit pour chacun des 600 blocs sprites chaque mise à jour du cadre:
//SLOOWWWNESS /LEAKING NSAUTORELEASEPOOL IS here (freezing every second or so)
UIColor *color = [palette objectAtIndex:colorNum];
//BUT DOESNT HAPPEN HERE... (works at full speed)
UIColor *color = [UIColor colorWithRed:0.25f green:0.25f blue:colorNum/15.0 alpha:1.0f];
... où la palette est une propriété NSArray dans l'image-objet, et contient une liste d'objets UIColor que j'ai créé. Ce tableau d'objets UIColor est créé une seule fois, lorsque l'application est lancée, et tous les sprites utilisent le même tableau.
Vous avez des idées?
Pouvez-vous poster plus de code autour de l'endroit où ces appels sont faits? Obtenir un objet hors d'un tableau devrait être rapide, au moins aussi rapide que la création d'un nouvel objet UIColor – kubi
salut Kubi voir ci-dessous, c'était une erreur hors limite de l'index après tout. Doh! – avance