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]];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 5: Adquisición más grande y mejor
El capítulo 5 – Adquisición de más grande y mejor
La idea esencial de este capítulo deberá hablar del proyecto animoso simple del capítulo anterior. Lancé todo en una clase, claramente no lo que usted quiere hacer para juegos más grandes. Pero la adquisición del de la misma clase al verdadero diseño de código es un paso grande que unos dudan en tomar. Haré esto más fácil y hablaré de cuestiones comunes y sus soluciones, tal como que a seperate, que subclasificar de y como usted puede tener todos los objetos de seperated se comunican el uno con el otro e intercambian la información de varios modos. But getting from one-class to real code design is a big step which some hesitate to take. I’ll make that easier and discuss common issues and their solutions, such as what to seperate, what to subclass from and how you can have all the seperated objects communicate with each other and exchange information in various ways.
Un tema grande será por supuesto como aprovechar la jerarquía de escena cocos2d’s y qué escollos esto puede tener moviéndose de un juego de capa sola a uno que tiene capas múltiples y hasta escenas múltiples.
En cuanto al título de capítulo no estoy tan seguro si esto será él. Tal vez a lo largo del camino mientras escribo que lo cambiaré. ¡Bienvenida de suposiciones! Suggestions welcome!
El capítulo será presentado el viernes, 30 de julio.
¿Qué es su tomar en la estructura de código de cocos2d buena?
¿Luchó alguna vez usted con conceptos de diseño cocos2d? ¿O la jerarquía de escena cocos2d? ¿O cómo a la disposición una escena y dividen su juego en partes lógicas? Dígame sobre ello. Or how to layout a scene and divide your game into logical parts? Tell me about it.
Sé que las preguntas de tesis son algo genéricas para preguntar. Es sobre las cosas que no se sienten correctas, pero allí no parecen ser un camino mejor, más obvio. ¡Creo que conocemos algunos de aquellos, si usted hace, estar seguro de decirme! Deje un comentario o escríbame un correo electrónico. I think we all know some of those, if you do, be sure to tell me! Leave a comment or write me an email.
Resumen de trabajo en el Capítulo 4 – juego Primero simple
El juego que decidí hacer es llamado Gota de Garabato y rasgos que dejan caer arañas y un acelerómetro controló al extranjero que trata de evitar las arañas. En conjunto estaba dividido en 8 pasos concretos. Partes y muchos comentarios de código, también. Lots and lots of code comments, too.
Esto comienza recursos bastante simples, agregatorios a Xcode y adición de elfos. Consigue más gameplay-esque cuando los mandos de jugador conducidos por el acelerómetro fueron pellizcados para proporcionar la aceleración y la desaceleración del objeto de jugador. En contraste, los movimientos de arañas sólo son conducidos por acciones. In contrast, the spiders movements are driven only by actions.
Le presento en dos rasgos indocumentados de cocos2d, a saber CCArray que es desde v0.99.4 solía almacenar a todos los niños de un nodo. El otro son la clase de CGPointExtension que tiene todas las funciones normalmente proporcionadas por un motor de física, sin embargo no cada juego debería unir un motor de física sólo porque uno necesita aquellas funciones de matemáticas. Por eso CGPointExtension entra práctico. That’s why CGPointExtension comes in handy.
Con el método ccpDistance los controles de colisión son hechos. Las colisiones radiales simples, y en el modo de depuración los radios de colisión son dibujadas también.
Entre el CCLabel para el resultado fue sustituido por CCBitmapFontAtlas, porque esto mató el framerate. Dentro de poco mencioné a Hiero y como usarlo en principio pero para todos los detalles no había ningún cuarto. Pero mientras yo estaba en ello creé el Seminario Hiero. But while I was at it I created the Hiero Tutorial.
Al final de proyecto añadí que unos pulen que no es descrito en el libro (demasiados detalles), pero realmente añade a mirada del juego y sensación. La gota de arañas, cuelgue en allí, luego culpe antes de caerse, todas las acciones de utilización hechas. También he añadido el hilo que ellos cuelgan de usar ccDrawLine. Y luego hay un juego sobre la etiqueta que muestra hasta más uso de acción. I’ve also added the thread they’re hanging from using ccDrawLine. And then there’s a game over label which shows even more action use.
Uno de los principios que seguí debe alejarse de coordenadas fijas tanto como posible. Entonces el proyecto, una vez terminado, realmente corrió sólo fino en un iPad. Aunque la experiencia sea uno diferente, hay más caída de arañas y ellos se caen más rápido pero también hay el espacio más seguro para maniobrar a. Although the experience is a different one, there’s more spiders dropping and they drop faster but there’s also more safe space to maneuver to.
Ah y, el arte animoso es toda la mina. ¡Sí, sé … pero las arañas del Hombre realmente tienen sólo seis piernas!









