[Gelöster] unheimlicher Szene-Ändern-Programmfehler …

Am 27. Juli 2010, in cocos2d, durch Steffen Itterheim by Steffen Itterheim

Ich muss helfen. Ich bin in fremde Probleme mit einem sehr einfachen cocos2d v0.99.4 von der Cocos2d-Projektschablone geschaffenes Projekt geraten. Es sind zwei Szenen mit einer Schicht jeder viel wie die regelmäßige HelloWorldScene Schicht. Jede Szene soll einfach sich mit der anderen Szene auf der Berührung ersetzen. Was geschieht, ist, dass die erste mit runWithScene angefangene Szene nie deallocated nach der ersten Szene-Änderung ist. So bleibt es im Gedächtnis und setzt fort, die Berührungen zu erhalten, was bedeutet, dass sich eine Berührung immer als ob benimmt, von Anfang an auf die zweite Szene umschaltend. It’s two scenes with a layer each, much like the regular HelloWorldScene layer. Each scene is simply supposed to replace itself with the other scene, on touch. What happens is that the first scene started with runWithScene is never deallocated after the first scene change. So it stays in memory and keeps receiving the touches, which means a touch is always behaving as if switching from the first to the second scene.

Was mehr ist, wenn ich den onEnter und die onEnterTransitionDidFinish Methoden zur ersten Szene hinzufüge, ohne irgendeinen Code zu ihnen hinzuzufügen, erhält die erste Szene/Schicht keine Berührungsereignisse überhaupt. Die zweite Szene zeigt dieses Verhalten und Arbeiten nicht, die mit diesen durchgeführten Methoden fein sind.

Vielleicht überblicke ich gerade das sehr offensichtliche, wenn Sie ansehen und mir mitteilen konnten, wenn es irgendetwas gibt, was ich falsch mit diesem Code tue, teilen Sie mir bitte mit! Danke.

Laden Sie den Code hier herunter: ScenesAndLayers02

Aufhebung des Bewusstseins: Speichergebrauch & Leckstellen

Am 25. Juli 2010, in der Programmierung, Von der Erfahrung, cocos2d Sprechend, durch Steffen Itterheim by Steffen Itterheim

Indem es anderen half, ihre Cocos2d-Projektprobleme im Laufe des letzten Jahres zu lösen, wurde es offensichtlich, dass viele Projekte mindestens ein Hauptproblem in einem dieser Gebiete haben:

  • Speichermanagement
  • Quellenmanagement
  • Codestruktur

Beispiele

Speicherverwaltungsprobleme erstrecken sich normalerweise davon, zu viel Gedächtnis zuzuteilen, entweder zu viele Texturen Vorderseite ladend, die nur dabei sind, später, oder durch Speicherleckstellen wie Szenen nicht deallocating erforderlich zu sein, Szenen schaltend. Quellenverwaltungsproblem-Reihe davon, die richtigen Mittel zum richtigen Ziel nicht hinzuzufügen, häufig hinauslaufend, vergrößerte App Größe, weil Mittel zum Bündel hinzugefügt, aber nie durch den App verwendet werden. Es konnte auch bedeuten, identische Quellendateien zu laden, außer dass sie verschiedene Dateinamen haben (Kopien?), zusätzliches Gedächtnis verbrauchend. Oder nicht sich dicht verpacken lassende Elfen in Textur-Atlasse, aber stattdessen das Verwenden eines Textur-Atlasses pro Spielgegenstand - während das von einer Einstellung von logischem seperation verständlich ist, vergeudet er wirklich Gelegenheiten für die Optimierung. 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.

Codieren Sie schließlich Struktur oder haben Sie an davon Mangel regelmäßig führt "zu allem in einer Klasse" Codedesign, das ein Entwicklungsprozess am wahrscheinlichsten aber nicht absichtlich ist. Es ist ziemlich üblich, Klassen mit Tausenden von Linien des Codes, manchmal sogar gehende vorige 10.000 Linien des Codes in einer Klasse zu sehen. Andere Dinge verwenden zu viele CCLayers ohne sie, einen klaren Vorteil hinzufügend, um zum Beispiel gerade alle Knoten an einer spezifischen Z-Ordnung zusammen zu gruppieren oder sie durch die Funktionalität, eg eine Schicht für Feinde, ein für Spieler, ein für den Hintergrund, ein für UI, ein für die Kerbe, ein für Partikel-Effekten, und so weiter - ohne einige dieser Schichten zu gruppieren, die dafür verwenden werden, worin sie wirklich gut sind: das Ändern vielfacher Knoten sofort, wie das Bewegen, das Schuppen, das Drehen oder die Z-Umstellung sie. Und natürlich gibt es die Kopie & Teig-Hölle, großen Blöcke des Codes, der in verschiedenen Plätzen wieder hervorgebracht ist, um nur einige Rahmen zu modifizieren, anstatt eine Methode zu schaffen, die die modifizierbaren Rahmen als Argumente nimmt. Sogar Fachleuten ich arbeitete mit bekommen so verwendet zum Tun, dass es hart wurde, gerade den Widerstand des Lassens zu überwinden, gehen von alten Gewohnheiten. Aber sie erfuhren. 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.

Zusammenfassung

Nichts dieses Codedesigns und strukturierend schlägt mich als sonderbar oder überraschend. Ich habe Code wie das selbst geschrieben. Ich glaube auch, ob es gut genug ist und Arbeiten, dann warum zum Teufel nicht? Es ist eine Sache der Erfahrung, und es ist nur mit der Erfahrung, die Sie klar sehen, wie man Dinge verbessert. Das läuft auf die regelmäßige Lernkurve hinaus, wo nur Ausbildung und das Unterrichten und gerade einfach Bilden von Fehlern und Lernen aus ihnen im langen Lauf helfen. Es ist, wie wir Dinge erfahren. 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.

Andererseits können die Dinge wie Speicher- und Quellenmanagement auch erfahren werden, aber sie haben eine verschiedene Natur. Sie können statistisch bewertet werden, sie konnten berechnet und automatisch nachgeprüft werden. Das lässt mich mich fragen, ob es nicht eine Art Automation und Informationswerkzeuge gibt, die würden Entwicklern helfen, bessere Ergebnisse in Bezug auf den Speichergebrauch und das Quellenmanagement zu erreichen? Inzwischen ist es alles über die Aufhebung des Bewusstseins … 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 …

Aufhebung des Speicherbewusstseins

Am wichtigsten denke ich, dass wir mehr Bewusstsein zu diesen Problemen cocos2d Entwicklern erheben müssen. Ein Schritt dazu würde für cocos2d sein, um einen "verfügbaren Speicherschalter" neben dem FPS-Schalter zu zeigen. Ich pflegte, CCDirector zu flicken, um einfach Gedächtnis statt FPS zu zeigen, seitdem das immer für mich wichtiger war. Gefährte cocos2d Entwickler Joseph sandte mir seine Version, um beide zu zeigen - ich dachte einfach an das offensichtliche nicht. So, wenn Sie gern FPS und verfügbares Gedächtnis neben einander sähen, denke ich, dass Sie die Änderungen zu CCDirector entworfen hier behandeln können: 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, tragen unter @interface bei:
+ (doppelter) getAvailableBytes;
+ (doppelter) getAvailableKiloBytes;
+ (doppelter) getAvailableMegaBytes;

//CCDirector.m, tragen als passend bei:
#include <sys/sysctl.h>  
#import <mach/mach.h>
#import <mach/mach_host.h>

[...]

+ (doppelter) 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);

  wenn (kernReturn! = KERN_SUCCESS)
  {
    geben Sie NSNotFound zurück;
  }

  kehren Sie (vm_page_size * vmStats.free_count) zurück;
}

+ (doppelter) getAvailableKiloBytes
{
  kehren Sie [CCDirector getAvailableBytes] / 1024.0 zurück;
}

+ (doppelter) getAvailableMegaBytes
{
  kehren Sie [CCDirector getAvailableKiloBytes] / 1024.0 zurück;
}

[...]

- (Leere) showFPS
{
  Rahmen ++;
  accumDt + = dt;

  wenn (accumDt> CC_DIRECTOR_FPS_INTERVAL)  {
    frameRate = frames/accumDt;
    Rahmen = 0;
    accumDt = 0;

    //die einzige Änderung in showFPS ist diese Linie:
    NSString *str = [[NSString alloc] initWithFormat: "%. 1f  %.1f", frameRate, [CCDirector getAvailableMegaBytes]];1f  %.1f", frameRate, [CCDirector getAvailableMegaBytes]];

    [FPSLabel setString:str];
    [Str-Ausgabe];
  }
}

Aufhebung des Bewusstseins zum Auslaufen von Szenen

Außerdem empfehle ich hoch, stark und mit der am meisten äußersten Verstärkung (ohne eine Pistole herauszuziehen), cocos2d Entwicklern, oft die dealloc Methoden Ihrer Szene zu überprüfen. Fügen Sie vorzugsweise einen Unterbrechungspunkt dort hinzu, oder fügen Sie zumindest die Protokollierungslinie hinzu: CCLOG ("dealloc: %", selbst). Wenn Sie eine mehr sichtbare, aber weniger aufdringliche Methode wollen, konnten Sie etwas wie Verwahrung des Schirms tun oder einen Ton spielend, wann auch immer die letzte Szene deallocated ist, so dass Sie so verwendet dazu werden, dass, wenn Sie nicht sehen oder es mehr hören, es sofort Ihre Aufmerksamkeit erhebt. 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.

Wenn jederzeit während der Entwicklung Ihres Projektes die dealloc Methode einer Szene nicht genannt wird, wenn Sie Szenen ändern, lassen Sie Gedächtnis durch. Das Auslaufen der ganzen Szene ist eine Speicherleckstelle der schlechtesten Art. Sie wollen das früh fangen, während Sie noch Ihren Weg zurückgehen können, der das Problem verursacht haben könnte. Sobald Sie zum Verwenden von Hunderten vom Vermögen und Tausenden von Linien des Codes kommen und dann begreifen, dass die Szene nicht deallocated ist, werden Sie in für eine lustige Fahrt sein, die versucht sich zu belaufen, wo es herkommt. In diesem Fall, Knoten entfernend, sie unkommentierend, bis Sie auf dem Schuldigen hereinbrechen können, ist wahrscheinlich die beste Strategie, neben dem Verwenden von Instrumenten (der ich zu hilfsbereit in jenen Fällen nicht gefunden habe). 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).

Ich geriet in solch ein Problem wie, weil ich den CCScene-Gegenstand zu Unterklassen passierte, so dass sie Zugang zu den Methoden der Szene haben. Die Unterklasse behielt die Szene und wurde selbst aus CCNode abgeleitet und trug zum CCScene als Kind bei. Das Problem damit: Während der Reinigung der Szene entfernte es richtig alle Kinderknoten, aber einige der Kinderknoten behielten noch die Szene. Deswegen wurde ihre dealloc Methode nie genannt, und der Reihe nach war die Szene nie deallocated. 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.

Cocos2d-Buch, Kapitel 2: Angefangen zu werden

Am 2. Juli 2010, in Ansagen, Buch, cocos2d, durch Steffen Itterheim by Steffen Itterheim

Kapitel 2 - Angefangen zu werden

Dieses Kapitel fängt mit den üblichen Vorbedingungen an. Laden Sie herunter und installieren Sie I-Phone SDK und cocos2d. Installation cocos2d Schablonen. Das Schaffen des ersten Projektes von einem cocos2d plant Schablone. Installing cocos2d Templates. Creating the first project from a cocos2d project template.

Nach dem, was ich bereits schrieb, dass ich einschätze, dass das ungefähr ein Drittel des Kapitels sein wird. Ich denke, was in diesem Kapitel am interessantesten sein würde, soll über die allgemeine Codestruktur von Cocos2d-Projekten sprechen. Die Grundelemente wie Szenen, Schichten und Knoten. Wie man von einem Schirm bis einen anderen wechselt, um zu sehen, dass wir wirklich etwas Kühles mit wenig Anstrengung tun. Dafür denke ich, dass die vorgesehenen Auswählenden auch in Zeitübergänge vorgestellt werden sollten, und ein Schirm eine Schicht sein könnte, die auf den Berührungseingang wartet, um zum folgenden Schirm vorwärts zu gehen. The basic elements like Scenes, Layers and Nodes. How to transition from one screen to another, to see that we’re actually doing something cool with little effort. For that I think the scheduled selectors should also be introduced to time transitions, and one screen might be a Layer which is waiting for touch input to advance to the next screen.

Es könnte auch ein guter Platz sein, cocos2d Speichermanagement zu besprechen, wie statische Autoausgabe-Initialisierungsprogramme, und sich überzeugend wird dealloc genannt, wenn Sie Szenen schalten - sonst haben Sie offensichtlich eine Speicherleckstelle.

Die Absicht ist, den Leser in eine Position zu bekommen, wo er sich bequem fühlt, eine Schirm-Struktur in cocos2d legend. Er weiß, wie man Gegenstände initialisiert, und wie man hinzufügt und sie von der Szene entfernt. Das Fundament des Arbeitens mit cocos2d, wenn Sie so werden. The foundation of working with cocos2d if you so will.

Was tut, denken Sie, sollte im Kapitel 2 sein?

Teilen Sie mir mit, wenn Sie denken, dass ich irgendetwas Wichtiges verpasse. Wenn Sie keine Vorschläge haben, dann gerade denken daran, was Sie aus dem Kapitel erwarten würden, indem Sie diese Beschreibung lesen, die Ihnen einige Gedanken geben könnte.

Auch ich würde irgendwelche Tipps und die allgemeinen Fallen begrüßen, in die erst-malige cocos2d Entwickler sich fangen könnten. Erfahrene Tipps sind auch, jene kleinen scheußlichen Dinge oder Gewohnheiten willkommen, die Sie später beißen konnten, wenn Sie sie vom Anfang nicht denken.

Ich freue mich auf Ihr Feed-Back! Früher besser. Kapitel 2 wird als nächstes Freitag, der 9. Juli vorgelegt. Chapter 2 will be submitted next Friday, July 9th.

Was für das Kapitel nach diesem geplant wird

Um gerade Kapitel 2 im Zusammenhang für das Kapitel 3 zu stellen, plane ich, über wesentliche cocos2d Klassen und Prozesse zu sprechen. Elfen, Etiketten, Menüs, Handlungen, usw. Es wird Ihnen zeigen, wie man mit ihnen arbeitet, kleine Codeschnipsel verwendend. Das Kapitel wird wahrscheinlich einen "Bezugs"-Charakter mit verschiedenen Codeproben haben, so dass sich erfahrene Benutzer bequem fühlen, vorn hüpfend, während Anfänger es noch leicht und ermutigend finden, um die Details aufzunehmen. It’ll show you how to work with them using small code snippets. The chapter will probably have a “reference” character with various code samples, so that experienced users feel comfortable skipping ahead while beginners still find it easy and encouraging to pick up the details.