SKSpriteKit : Performance-Problem mit enumerateObjectUsingBlocks // Eigenem "Grid-System"

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • SKSpriteKit : Performance-Problem mit enumerateObjectUsingBlocks // Eigenem "Grid-System"

    Hallo Zusammen,

    ich arbeite gerade in einem Endlos-Side-Scroller-Game, bei dem auf dem Bildschirm zufällig Items zum einsammeln erscheinen sollen.

    Ich habe mir im Vorfeld überlegt ein selbstgebasteltes Grid (32 Felder/SpriteNodes) über die gesamte Bildschirmbreite zu legen und dieses dann via STPrallax zu scrollen. Das klappt soweit.
    Deshalb ein Grid, weil ich das Gefühl habe, dann einen guten Einfluss darauf zu haben, wo Items platziert werden dürfen/können/sollen.
    Anschliessend prüfe ich ob ein Feld aus dem Grid (position.x) in den negativen Bereich rutscht. Ist das der Fall, soll ein zufälliges Item in das Feld geladen werden (wird ja immer wiederholt).

    Und hier liegt - glaube ich - der Knackpunkt. So wie ich es realisiert habe, ist es recht Ressourcen-Hungrig. Mal davon ab, ob die Idee mit dem Grid die Ideal-Lösung ist (Vorschläge auch gern gesehen :D).

    Gibt es gezielt die Möglichkeit auf eine gewisse Ebene die Children abzufragen? Schaut mal wie ich das gemacht habe (gruselig):

    Quellcode

    1. self.lastSpawnTimeInterval += timeSinceLast;
    2. if (self.lastSpawnTimeInterval > 1.5) {
    3. self.lastSpawnTimeInterval = 0;
    4. // Get StuffGrid:
    5. [self.parallaxNode enumerateChildNodesWithName:@"stuffGrid" usingBlock:^(SKNode *node, BOOL *stop){
    6. // Get StuffGrid Rows:
    7. [[_stuffGrid children] enumerateObjectsUsingBlock:^(SKNode *node, NSUInteger idx, BOOL *stop){
    8. // Get StuffGrid Pieces an check them:
    9. [[node children] enumerateObjectsUsingBlock:^(SKNode *node, NSUInteger idx, BOOL *stop){
    10. // Wenn es tatsächlich eine StuffCell ist:
    11. if ([[node.name substringWithRange:NSMakeRange(0, 10)] isEqual: @"stuffCell_"]) {
    12. NSLog(@"STUFF CELL: %@",node.name);
    13. // Wenn die Cell außerhalb des sichtbaren Bereichs ist:
    14. NSLog(@"node position: %f", node.position.x);
    15. if(node.position.x < 1){
    16. // Füge ein neues Item hinzu:
    17. [node addChild:[self spawnItemInNode:node]];
    18. }
    19. }
    20. }];
    21. }];
    22. }];
    23. }
    Alles anzeigen


    Ich hoffe das alles verständlich war... und ich freue mich auf eure Idee, Ratschläge etc. :)

    Gruß,
    Florian
  • || [_][o][_][X][_][_][_][_] || <- Jede Zeile hat einen eigenen Namen (stuffRow_1-4) (jede Zelle hat auch einen eigenen Namen)
    || [_][_][_][_][_][X][_][_] ||
    || [_][X][_][X][_][_][_][_] ||
    || [_][X][_][_][_][_][o][_] ||

    ( || = Bildschirmrand / X & o = Beispielitems / [_] = Zelle)

    Und enumerateChildNodesWithName:usingBlock: spricht doch EIN gezieltes Object an - si?
  • Das würde ich gern, allerdings habe ich zuvor eine Frage:

    Wie kann ich bei enumerateChildNodeWithName auf bestimmte children zugreifen?
    Gebe ich "[self enumerateChildNodesWithName..." an, scheint er nur in der Ebene zu "suchen".
    Dann gibt es noch "[[self children] enumerateChildNodesWithName".

    Und dann? Kann ich mich exakt navigieren?

    Danke euch! :)
  • Klasse danke für den Tipp!

    Quellcode

    1. [[self childNodeWithName:@"//stuffFrameRow"] enumerateChildNodesWithName:@"stuffCell" usingBlock:^(SKNode *node, BOOL *stop){
    2. NSLog(@"Node: %@, Position: %f", node.name, node.position.x);
    3. // Füge ein neues Item hinzu:
    4. [node addChild:[self spawnItemInNode:node]];
    5. }];


    Ich dachte mit dem oben genannten Code kann ichd ann auf alle "stuffCell"s zugreifen - aber irgendwie passiert da nicht viel. Er findet zwar "stuffCell", aber er kann z.B. nicht seine position ermitteln. Handelt es sich tatsächlich um die "echte" Node?!

    Danke für eure Orientierungshilfen :)

    EDIT: Evtl. liegt es an meinem Aufbau. Ist es denn sonst grundsätzlich richtig?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von dyna87@gmail.com ()