Cocos2d 2.0: ¿cuándo es una buena práctica "purgar" cachings?

¿Es una buena práctica llamar a los siguientes methods de "purga" al comienzo de cada escena? Y si no, ¿cuándo debo llamarlos? ¿Hay algún tutorial para explicar cuándo usar cada llamada? ¿Me estoy perdiendo de algo?

[CCTextureCache purgeShanetworkingTextureCache]; [CCSpriteFrameCache purgeShanetworkingSpriteFrameCache]; [CCAnimationCache purgeShanetworkingAnimationCache]; [CCShaderCache purgeShanetworkingShaderCache]; [[CCFileUtils shanetworkingFileUtils] purgeCachedEntries]; 

(Estoy usando Cocos2d 2.0 y ARC está habilitado, no creo que sea relevante, pero aún así pensé que valía la pena mencionarlos)

¡IMO, es una mala práctica limpiar las cachings de cocos2d en absoluto! Depurar cachings es una herramienta tan útil como un martillo en la reparación de dispositivos electrónicos.

¡Es contraproducente purgar todo solo para que los personajes recarguen sus animaciones y texturas purgadas en el siguiente fotogtwig porque las necesitan desesperadamente! Si purgas los cachings incondicionalmente, no ha realizado su trabajo de gestión de memory de activos (bueno).

Todavía puede haber usos para purgar todo, pero deberían ser pocos y distantes (como cerrar cocos2d por completo en una aplicación UIKit), porque ¿por qué querrías eliminar todos los resources almacenados en caching ? Eliminas lo que has agregado y, si eso no es suficiente, has hecho todo lo posible.

Como desarrollador de aplicaciones, debe tener en count el uso total de memory de su aplicación y qué activos están en uso y cuáles no. Incluyendo los resources manejados por cocos2d. Suelte solo aquellos activos que sabe que no están en uso actualmente y que tampoco serán necesarios en un futuro cercano. Es realmente así de simple, pero es más trabajo que simplemente purgar cachings, lo que parece hacer el trabajo, pero realmente es simplemente algo terrible que hacer.

Un problema con la debugging de cachings específicamente durante las advertencias de memory es que pueden aparecer advertencias de memory cuando precargas activos. Ahora cuando purgas los cachings mientras cargas los resources, estás disparándote en el pie porque los activos ya precargados se eliminarán y luego deberán cargarse nuevamente tan pronto como sea necesario. En el peor de los casos esto puede causar una advertencia de memory irrecuperable si la recarga ocurre instantáneamente debido a la memory adicional necesaria para cargar los activos en primer lugar (es decir, las texturas usan memory 2 veces mientras se carga durante un corto período de time).

En la mayoría de los casos, la purga de cachings solo demorará la terminación relacionada con la advertencia de memory, mientras se agrega retraso al juego mientras tanto. En los casos restantes, simplemente se convertirá en una mala experiencia, ya que el juego tartamudea para recuperarse, posiblemente durante un período de time más largo.

Cocos2D purga los cachings durante las advertencias de la memory solo como medida de último recurso, y principalmente para desarrolladores que no se preocupan por tales tonterías como el uso de memory. Es una solución que funciona para tomar los primeros pasos de desarrollo de la aplicación, tal vez incluso para la primera aplicación de un desarrollador, pero en realidad es bastante inútil para cualquier esfuerzo serio / ambicioso.

Como desarrollador de aplicaciones ambicioso, con la mirada puesta en la calidad, debes reactjsr a las advertencias de la memory de una manera más elegante. Lo que significa que, ante todo, esforzarse por minimizar por completo las advertencias de la memory ( aquí hay algunos consejos ) y cuando ocurren, debe asegurarse de dos cosas:

  1. Su aplicación puede terminar pronto, asegúrese de save el estado de la aplicación.
  2. Libera cualquier memory que esté absolutamente segura de que no es necesaria en este momento.

Respecto al número 2: si está progtwigndo cerca del borde, es posible que desee recurrir a una especie de modo de "security de la memory" donde puede ajustar por completo el uso de la memory de su aplicación, por ejemplo, mostrando less sprites, partículas, combinando el uso de dos texturas, eliminación de ciertas texturas a expensas de times de carga adicionales, etc.

Si no puede liberar suficiente memory con el paso n. ° 2, sucederá n. ° 1 casi inevitablemente, sin importar si purgas o no los cachings de cocos2d. Purgar las texturas "no utilizadas" de CCTextureCache puede ayudar, pero como los frameworks de sprite conservan la textura, por lo general no hace mucho (o nada) si está utilizando atlas de textura sin liberar primero los frameworks de sprite correspondientes. Mantenlo en mente.

El process para manejar una advertencia de memory es:

  1. Sepa qué activos están en uso, y cuáles son simplemente almacenados en caching para networkingucir los times de carga.
  2. Elimine los frameworks de sprite "no necesarios" y luego llame a removeUnusedTextures de CCTextureCache. Esto tiene la mayor probabilidad de liberar la mayor parte de la memory que su aplicación está usando mientras que realmente no la necesita más.
  3. Elimine cualquier otra memory extra que haya asignado en su código pero que no esté actualmente en uso, o vuelva a utilizar el modo "seguro de memory" (sin embargo, puede implementar esto).
  4. Espero lo mejor.

¡No purgues los cachings de cocos2d incondicionalmente! No ayuda, probablemente empeorará las cosas.

Teniendo en count todas las cachings de cocos2d, CCTextureCache retendrá el 99% de la memory. Por lo tanto, es bastante inútil purgar cualquiera de los otros cachings de todos modos, simplemente ignórelos.

Realmente solo necesitas mirar el atlas de textura que estás usando actualmente, y aquellos que no eliminas los frameworks de sprite y sus texturas.

Si usa texturas .pvr.ccz, puede incluso ignorar el "almacenamiento en caching para networkingucir los times de carga" y eliminar de la memory cada atlas de textura cada vez que deje de usarlo, porque .pvr.ccz carga tan rápido que apenas cualquier diferencia en lo que respecta a cambiar escenas. Eso también ayuda a evitar las advertencias de la memory en primer lugar.