Mon application de visualisation de données génère un pic de consommation de mémoire lors du redessin (setNeedsDisplay qui déclenche drawRect). Je suis actuellement en train de redessiner l'ensemble de la vue qui contient le tracé de données. Cette vue est beaucoup plus grande que l'affichage de l'appareil. Est-il possible de dire à CoreGraphics d'allouer juste assez de mémoire pour dessiner chaque élément (chaque élément est un petit bloc rectangulaire beaucoup plus petit que l'affichage de l'appareil) et de libérer la mémoire quand c'est fini, plutôt que mon approche naïve actuelle?iPhone + UIView. Consommation de mémoire énorme pendant drawRect. Des stratégies pour réduire cela?
Merci d'avance.
-Doug
MISE À JOUR 8 décembre 08h28 EST
Voici le code correspondant avec wordage explicatif. J'utilise Instruments avec ObjectAlloc, Memory Monitor et Leaks en cours d'exécution. La seule fuite de mémoire que j'ai est dû à la NSOperationQueue ne libérant pas de mems. Ceci est mineur et non pertinent.
Architecturalement l'application se compose d'un tableView avec une liste d'endroits intéressants le long du génome humain à inspecter. Lorsqu'une ligne de table est sélectionnée, je mets en file d'attente une opération de collecte de données qui renvoie des données appelées alignmentData. Ces données sont ensuite représentées sous forme de dalles rectangulaires horizontales.
Dans un premier temps, lorsque le tableView lance mon empreinte mémoire est de 5 Mo.
- (void)viewWillAppear:(BOOL)animated {
// Initial dimensions for the alignment view are set here. These
// dimensions were roughed out in IB.
frame = self.alignmentView.frame;
frame.origin.x = 0.0;
frame.origin.y = 0.0;
frame.size.width = self.scrollView.contentSize.width;
frame.size.height = 2.0 * (self.containerView.frame.size.height);
}
Remarque: Après viewWillAppear: est appelé l'empreinte mémoire n'a pas bougé. Même si le alignmentView est dimensionné bien au-delà des dimensions de l'affichage.
Cette méthode est appelée à partir de l'opération de collecte de données.
- (void)didFinishRetrievingAlignmentData:(NSDictionary *)results {
// Data retrieved from the data server via the data gathering operation
NSMutableData *alignmentData = [[results objectForKey:@"alignmentData"] retain];
NSMutableArray *alignments = [[NSMutableArray alloc] init];
while (offset < [alignmentData length]) {
// ...
// Ingest alignmentData in alignments array
// ...
} // while (offset < [alignmentData length])
[alignmentData release];
// Take the array of alignment objects and position them in screen space
// so that they pack densely creating horizontal rows of alignment objects
// in the process.
self.alignmentView.packedAlignmentRows =
[Alignment packAlignments:alignments basepairStart:self.startBasepairValue basepairEnd:self.endBasepairValue];
[alignments release];
[self.alignmentView setNeedsDisplay];
}
Après cette ligne de code:
self.alignmentView.packedAlignmentRows = ...
L'empreinte mémoire est de 13,8 Mo
Après cette ligne de code:
[self.alignmentView setNeedsDisplay];
Les pointes de l'empreinte mémoire à 21,5 MB , reste là pendant quelques secondes puis revient au niveau préexistant de 13.8 MB
La solution que je cherche me permettrait essentiellement de créer une fenêtre de tampon de rendu horizontal qui est la hauteur d'une seule ligne d'objets d'alignement. Je voudrais y allouer son rendu de mémoire, puis le rejeter. Je le ferais encore et encore pour chaque rangée de données d'alignement.
En théorie, je pourrais rendre une quantité infinie de données avec cette approche qui bien sûr serait excellent ;-).
-Doug
En découpant vous voulez dire le diviser en petites sous-vues? – skyline75489