Question

Je suis en train de créer un jeu pour iPhone avec cocos2d, qui implique un grand nombre d’animations de personnages (au moins 25 différentes) .. pour lesquelles j’ai beaucoup de feuilles de sprites pesant chacune entre 100 Ko et 200 Ko .. Et j’avais l'habitude de créer AtlasSpriteManagers pour ces services à la demande. Mais quand j'ai testé cela dans l'appareil, il y avait beaucoup de ratés de performance autour de ces animations .. il manquait des images .. jeu suspendu tandis que les images étaient en cours de chargement et tout ..

J'ai donc décidé de créer une technique de préchargement et de mise en cache dans laquelle je regarde constamment vers l'avenir et de créer les éventuels AtlasSpriteManagers dont j'ai besoin, de les conserver dans un NSMutableDictionary et de les prendre à partir de là pendant l'animation .. et sur la base d'un compte d'utilisation variable, je les supprimerai plus tard de ce dictionnaire et libérerai de la mémoire .. Et j'utilise la méthode performSelectorInBackground pour appeler cette fonction 'loadASM' qui effectue cette création de AtlasSpriteManager et la stocke dans le dictionnaire.

[self performSelectorInBackground:@selector(loadASM:) withObject:fileName];

-(ASMHolder *)loadASM:(NSString *)fileName
{
AtlasSpriteManager *sprMgr = [AtlasSpriteManager spriteManagerWithFile:fileName capacity:40];
ASMHolder *asmHolder = [[ASMHolder alloc] init];
asmHolder.sprMgr = sprMgr; asmHolder.retainCount++;
[asmDict setObject:asmHolder forKey:fileName];

return asmHolder;
}

Mais les images ne semblent pas se charger si j'appelle cette méthode en arrière-plan à l'aide de performSelectorInBackground .. Une boîte de couleur blanche apparaît à l'emplacement où les images sont censées apparaître. Cependant, l'objet AtlasSpriteManager est créé et se trouve dans le dictionnaire. .. mais il ne fait que créer des sprites vierges .. Et au lieu de l'appel en arrière-plan, si j'appelle directement la méthode 'loadASM' (c'est-à-dire [self loadASM: nomFichier]), les images se chargent .. mais bien sûr, il y a le délai car il s'agit d'un appel synchrone.

J'ai même essayé de mettre en cache des objets Texture2D à la place des AtlasSpriteManagers, mais le résultat est identique.

(J'ai également essayé addImageAsync de TextureManager .. mais cela ne m'aide pas trop. car il ne donne pas le nom du fichier qu'il est en train de charger dans les arguments de la méthode de rappel, sans laquelle la clé de mon cache de dictionnaire ne peut pas être créée .. )

S'il vous plaît aider ..

Merci Sankar

Était-ce utile?

La solution

vous devez faire des choses spéciales pour utiliser OpenGL à partir de plusieurs threads. Voir cette question .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top