Levantamiento de conciencia: uso de memoria & agujeros
Ayudando a otros a solucionar sus cuestiones de proyecto de cocos2d durante el año pasado se hizo obvio que muchos proyectos tienen al menos un problema principal en una de estas áreas:
- dirección de memoria
- administración de recursos
- estructura de código
Ejemplos
Las cuestiones de dirección de memoria normalmente se extienden de asignar demasiada memoria, cargando demasiadas texturas frente que sólo van a ser necesarios más tarde, o por agujeros de memoria, como escenas que no desasignan cambiando escenas. Los problemas de administración de recursos se extienden de no añadir los recursos correctos al objetivo correcto, a menudo causando la talla de App aumentada porque los recursos son añadidos al bulto, pero nunca usados por App. Esto también podría significar cargar archivos de recurso idénticos salvo que ellos tienen nombres del archivo diferentes (¿copias?), consumiendo memoria adicional. O no elfos que hacen las maletas fuertemente en Atlas de Textura pero en cambio utilización de un Atlas de Textura por objeto animoso – mientras esto es comprensible desde un punto de vista de seperation lógico realmente gasta oportunidades de la optimización. It could also mean loading identical resource files except that they have different filenames (copies?), using up additional memory. Or not tightly packing sprites into Texture Atlases but instead using one Texture Atlas per game object – while this is understandable from a standpoint of logical seperation it does waste opportunities for optimization.
Finalmente, cifre la estructura o carezca de eso con regularidad lleva “a todo en una clase” diseño de código que es el más probable un proceso evolutivo, más bien que intencional. Es bastante común ver clases con miles de líneas del código, que a veces hasta va 10 000 líneas pasadas del código en una clase. Otras cosas usan demasiados CCLayers sin ellos añadiendo una ventaja clara, por ejemplo sólo para agrupar todos los nodos en un pedido de z específico juntos o agruparlos por la funcionalidad, eg una capa para enemigos, un para jugadores, un para el fondo, un para UI, un para el resultado, un para efectos de partícula, etcétera – sin cualquiera de estas capas usadas para en qué ellos están realmente bien: modificación de nodos múltiples inmediatamente, como movimiento, escalamiento, giro o z-nuevo-pedido ellos. Y por supuesto hay el infierno de pasta & copia, los bloques grandes del código reproducido en varios sitios sólo para modificar algunos parámetros en vez de crear un método que toma los parámetros modificables como argumentos. Incluso los profesionales trabajé con el conseguido tan acostumbrado para hacer que se hizo difícil sólo vencer la resistencia de piso de alquiler van de viejos hábitos. Pero ellos aprendieron. Other things are using too many CCLayers without them adding a clear benefit, for example just to group all nodes at a specific z order together or to group them by functionality, eg one layer for enemies, one for players, one for background, one for UI, one for score, one for particle effects, and so on – without any of these layers being used for what they’re really good at: modifying multiple nodes at once, like moving, scaling, rotating or z-reordering them. And of course there’s the copy & paste hell, large blocks of code reproduced in various places only to modify some parameters instead of creating a method which takes the modifiable parameters as arguments. Even professionals I worked with got so used to doing that it became hard just to overcome the resistance of letting go of old habits. But they learned.
Resumen
Nada de este diseño de código y estructuración me golpea como raro o sorprendente. He escrito el código como esto yo mismo. ¿También creo si está bastante bien y trabajos, entonces por qué diablos no? Es un asunto de experiencia y sólo es con la experiencia que usted claramente ve como mejorar cosas. Esto se reduce a la curva de aprendizaje regular donde sólo la formación y enseñar y sólo simplemente la fabricación de errores y el aprendizaje de ellos ayudan en la carrera larga. Esto es como aprendemos cosas. I also believe if it’s good enough and works, then why the hell not? It’s a matter of experience and it’s only with experience that you clearly see how to improve things. This boils down to the regular learning curve where only training and tutoring and just simply making mistakes and learning from them helps in the long run. That’s how we learn things.
Por otra parte, las cosas como Memoria y Administración de recursos también pueden ser aprendidas pero ellos tienen una naturaleza diferente. Ellos pueden ser según las estadísticas tasados, ellos podrían ser calculados y verificados automáticamente. ¿Esto me hace preguntarme si no hay los una especie de instrumentos de información y automatización que ayudarían a reveladores a conseguir mejores resultados en términos de uso de memoria y administración de recursos? Mientras tanto es todo sobre el levantamiento de la conciencia … This makes me wonder if there isn’t some kind of automation and information tools that would help developers achieve better results in terms of memory usage and resource management? In the meantime it’s all about raising awareness …
Levantamiento de Conciencia de Memoria
El más importantemente creo que tenemos que levantar más conciencia a estas cuestiones a reveladores cocos2d. Un paso hacia esto sería para cocos2d para mostrar un “contador de memoria disponible” junto al contador de FPS. Yo solía remendar CCDirector para mostrar simplemente la memoria en vez de FPS ya que siempre era más importante para mí. El revelador cocos2d del mismo tipo Joseph me envió su versión para mostrar a ambos – simplemente no pensé en el obvio. Tan si le gustara ver FPS y memoria disponible el uno al lado del otro creo que usted puede manejar los cambios en CCDirector perfilado aquí: I used to patch CCDirector to simply display memory instead of FPS since that was always more important to me. Fellow cocos2d developer Joseph sent me his version to display both – I simply didn’t think of the obvious. So if you’d like to see FPS and available memory next to each other I think you can handle the changes to CCDirector outlined here:
//CCDirector.h, añaden debajo de @interface: + (doble) getAvailableBytes; + (doble) getAvailableKiloBytes; + (doble) getAvailableMegaBytes; //CCDirector.m, añaden como apropiado: #include <sys/sysctl.h> #import <mach/mach.h> #import <mach/mach_host.h> [...] + (doble) getAvailableBytes { vm_statistics_data_t vmStats; mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT; kern_return_t kernReturn = host_statistics (mach_host_self (), HOST_VM_INFO, (host_info_t)&vmStats, &infoCount); si (¡kernReturn! = KERN_SUCCESS) { devuelva NSNotFound; } vuelva (vm_page_size * vmStats.free_count); } + (doble) getAvailableKiloBytes { vuelva [CCDirector getAvailableBytes] / 1024.0; } + (doble) getAvailableMegaBytes { vuelva [CCDirector getAvailableKiloBytes] / 1024.0; } [...] - (vacío) showFPS { marcos ++; accumDt + = dt; si (accumDt> CC_DIRECTOR_FPS_INTERVAL) { frameRate = frames/accumDt; marcos = 0; accumDt = 0; //el único cambio de showFPS es esta línea: NSString *str = [[NSString alloc] initWithFormat:@" %.1f %.1f", frameRate, [CCDirector getAvailableMegaBytes]]; [FPSLabel setString:str]; [liberación de str]; } }
El levantamiento de conciencia a escape de Escenas
Además muy, fuertemente y con el refuerzo sumo (sin sacar un arma) recomiendo a reveladores cocos2d por comprobar con frecuencia los métodos dealloc de su escena. Preferentemente añada un límite de facturación allí, o por lo menos añada la línea de registro: CCLOG (”dealloc: %”, mí). Si usted quiere un método más visible pero menos intruso usted podría hacer algo como centelleo de la pantalla o juego de un sonido siempre que la última escena sea desasignada, de modo que usted se haga tan acostumbrado para ello que cuando usted no lo ve u oye más esto inmediatamente levanta su atención. CCLOG(@”dealloc: %@”, self). If you want a more visible but less intrusive method you could do something like flashing the screen or playing a sound whenever the last scene is deallocated, so that you get so used to it that when you’re not seeing or hearing it anymore it immediately raises your attention.
Si en cualquier momento durante el desarrollo de su proyecto el método dealloc de una escena no es llamado cuando usted cambia escenas, usted divulga la memoria. El escape de la escena entera es un agujero de memoria de la clase peor. Usted quiere agarrar esto temprano mientras usted todavía puede volver sobre sus pasos que podrían haber causado el problema. Una vez que usted se pone a la utilización de cientos de activos y miles de líneas del código y luego realiza que la escena no es desasignada, usted estará en para un paseo divertido que trata de entender donde esto viene de. En este caso, quitar nodos no comentándolos hasta que usted pueda acercarse en el culpable es probablemente la mejor estrategia, al lado de la utilización de Instrumentos (que no he encontrado demasiado provechoso en aquellos casos). You want to catch that early while you can still retrace your steps that might have caused the problem. Once you get to using hundreds of assets and thousands of lines of code and then realize the scene isn’t deallocated, you’ll be in for a fun ride trying to figure out where that’s coming from. In that case, removing nodes by uncommenting them until you can close in on the culprit is probably the best strategy, next to using Instruments (which I haven’t found too helpful in those cases).
Me topé con tal problema una vez porque yo pasaba el objeto de CCScene a subclases de modo que ellos tengan el acceso a los métodos de la escena. La subclase retuvo la escena y fue sacada de CCNode y añadió al CCScene como el niño. El problema con esto: durante la limpieza de la escena esto correctamente quitó todos los nodos de niño pero algunos nodos de niño todavía retenían la escena. A causa de aquel su método dealloc nunca fue llamado, y por su parte la escena nunca fue desasignada. The problem with that: during cleanup of the scene it correctly removed all child nodes but some of the child nodes still retained the scene. Because of that their dealloc method was never called, and in turn the scene was never deallocated.
Libro de cocos2d, el Capítulo 3: Elementos necesarios
El capítulo 3 – Elementos necesarios
Este capítulo es una referencia sobre las clases fundamentales de cocos2d y como usarlos. Nodos, Capas, Escenas, Etiquetas, Elfos, Transiciones, Acciones, usted lo llama. También CCDirector, SimpleAudioEngine y otras clases de cosa única a menudo usadas también. Hablarán de conceptos más avanzados en un capítulo posterior, Spritesheets por ejemplo. Also CCDirector, SimpleAudioEngine and other often used singleton classes as well. More advanced concepts will be discussed in a later chapter, Spritesheets for example.
La sumisión del primer esbozo de capítulo es debida siguiente el viernes, 16 de julio.
¿Qué hace usted piensa debería estar en el Capítulo 3?
¿Sabe usted una clase cocos2d o proceso que usted piensa es esencial y debería ser hablado en este capítulo? ¡Avíseme!
Resumen de trabajo en el Capítulo 2 – Empezar
Por su parte detallé el proyecto de muestra Hola Mundial e hice una modificación simple usando la entrada de toque. Al mismo tiempo al menos algún nivel básico del entendimiento sobre clases cocos2d fue introducido pero la idea esencial de ello es hecha en el Capítulo 3. Además, había muchos aspectos teóricos de los cuales quise hablar también, sobre todo dirección de Memoria y memoria disponible así como expectativas que se ponen en pruebas sobre el Simulador contra un dispositivo. Y por supuesto los dispositivos y sus diferencias sutiles. Realmente espero que los amables de detalles sean apreciados aun si ellos no son el 100 % relacionado con cocos2d. Con regularidad veo a reveladores cocos2d luchar con cuestiones de memoria, con diferencias inesperadas en el dispositivo contra el Simulador, o comparar framerates del Simulador y posiblemente hasta el Ajuste construye. Esto me hizo querer extraviarse del camino trillado durante un momento para salvar con esperanza a los lectores algunas ideas falsas y el dolor asociado con ellos. In addition, there were a lot of theoretical aspects I wanted to discuss as well, most of all Memory Management and available memory as well as setting expectations on testing on Simulator vs. a device. And of course the devices and their subtle differences. I do hope that those kind of details are appreciated even if they’re not 100% related to cocos2d. I regularly see cocos2d developers struggling with memory issues, with unexpected differences on the device vs the Simulator, or comparing framerates of the Simulator and possibly even Debug builds. That made me want to stray off the beaten path for a moment to hopefully save the readers some misconceptions and the pain associated with them.
También realicé cuantos pasos un nuevo revelador tiene que pasar y cuánto allí debe aprender por si usted nunca haya estado trabajando con el I-Phone SDK antes. Esto comienza con el registro como el revelador de I-Phone y no se termina con la instalación del SDK porque usted también necesita los perfiles de aprovisionamiento, un rasgo muy hablado y molesto. Para todo esto mandé a la existencia (y excelente) la documentación de Manzana. Típicamente el cambio de procesos con cada nuevo I-Phone que SDK o puede estar hasta bajo NDA, así hablando como todo esto trabaja con el I-Phone SDK 4 no sería una idea buena desde poco después del libro es el I-Phone SDK 5 puede venir, introduciendo cambios en el Portal de Revelador e iTunes Se unen con ello. Realmente me consiguió la idea, y sé que los otros lo tienen también, que necesitamos algún Seminario de manos de la posesión que toma el un por los pasos de registrarse como el Revelador de I-Phone a la publicación de primer App de alguien, refiriéndose a la documentación oficial correcta para cada paso sin olvidar de escollos comunes que no están en los doctores oficiales. For all of this I refered to existing (and excellent) Apple documentation. Typically the processes change with each new iPhone SDK or may even be under NDA, so discussing how all of this works with iPhone SDK 4 wouldn’t be a good idea since shortly after the book is out iPhone SDK 5 may be coming, introducing changes to the Developer Portal and iTunes Connect with it. It did get me the idea, and I know others have it too, that we need some holding-hands Tutorial which takes one through the steps from registering as iPhone Developer to publishing one’s first App, by referring to the correct official documentation for each step while not forgetting about common pitfalls that are not in the official docs.
También noté que fácil puede deber pasar por alto como usted de repente introduce un nuevo concepto sin explicarlo primero. Y luego usted tiene que decidirse cuanta información es necesaria para introducir el concepto sin extraviarse demasiado lejos de qué usted quiere hablar en primer lugar. Es sobre todo difícil para mí porque tiendo a querer explicar todo detalladamente pero algunas cosas tienen que ser dejadas a una discusión posterior. Penso con mucha ilusión en la reacción editorial ahora. Esto ha ayudado a tremendeously para el primer capítulo y aprendí mucho de la redacción de Apress, entonces lo encuentro excitación que los expertos me señalan a los defectos y hacen suposiciones, entro para fijarlos y luego ver cuánto mejor es. Esto es como me gusta aprender cosas y esto va a ser uno de los conceptos principales del libro. Muestre como es hecho, como no debería ser hecho (si esto a menudo ha hecho incorrecto) y como puede ser hecho aún mejor si usted quiere evitar el problema en la carrera larga, explicando por qué. It’s especially hard for me because I tend to want to explain everything in detail but some things have to be left for a later discussion. I’m looking forward to editorial feedback now. It has helped tremendeously for the first chapter and I learned a lot from the Apress editorial staff, so I find it exciting that the experts point me to the flaws and make suggestions, I go in to fix them and then see how much better it is. That’s how I like to learn things and it’s going to be one of the core concepts of the book. Show how it’s done, how it shouldn’t be done (if it’s often done wrong) and how it can be done even better if you want to avoid trouble in the long run, while explaining why.










