2016-11-06 3 views
4

Ich erstelle einen zufälligen Gegenstand Spinner für meine iOS App in Swift mit SpriteKit, aber derzeit ist meine Methode nicht sehr effizient, und ich bin mir fast sicher, dass es nicht der beste Weg sein kann erreichen, was ich anstrebe. Der Prozess, dem ich momentan folge, ist im Wesentlichen.
- auf Szene Last-Schleife durch eine Liste von 13 verschiedenen Elementen (in JSON gespeichert)
- eine Gruppe von Knoten erstellen die relevanten Daten, die zeigt
- jede Gruppe von Knoten zu einer zweiten Gruppe von Knoten hinzufügen, die jeweils eine beweglichen entlang der x-Achse leicht, eine lange Reihe von SKNode der (die Elemente für den Spinner)
zu schaffen - Moving diese Gruppe entlang der x-Achse, was den Eindruck es Spinnen durch die ElementeWarum dauert das Erstellen großer Mengen von SKNodes so lange?

Aber diese Methode dauert etwa zu geben 6 Sekunden, um die Szene sogar zu laden (und die Verzögerung besteht darin, die Knoten dem viel größeren Knoten hinzuzufügen: group.addChild(spinnerItem)) und da ich erst neu bei Swift bin, bin ich mir sicher, dass es einen besseren Weg gibt, also jede Hilfe/Beratung wert aßen, um diesen Code zu verbessern, da er dringend Effizienzverbesserungen benötigt! Hier

ist die didMove Funktion ...

override func didMove(to view: SKView) { 
    var xPos = CGFloat(self.frame.width + 150) 
    var eventWeapon = weapon() 

    for n in 0...13{ 
     eventWeapon = getWeapon(caseName: "chromaCase", weaponID: n) 
     print(eventWeapon) 
     let texture = createSpinnerItem(wName: "\(eventWeapon.name)", wSkin: "\(eventWeapon.skin)", wColor: "\(eventWeapon.color)") 
     let spinnerItem = SKSpriteNode(texture: texture) 
     spinnerItem.position = CGPoint(x: xPos, y: self.frame.height/2) 
     group.addChild(spinnerItem) 

     xPos = xPos + 300 * 1.2 
    } 

    self.addChild(group) 
    group.run(SKAction.moveBy(x: -5000, y: 0, duration: 2)) 
} 

und die createSpinnerItem Funktion innerhalb der verwendeten ...

func createSpinnerItem(wName: String, wSkin: String, wColor: String) -> SKTexture { 
    let object = SKNode() 

    let bGround = SKShapeNode(rectOf: CGSize(width: 300, height: 300)) 
    bGround.fillColor = color.offWhite 
    bGround.strokeColor = color.gray 
    bGround.lineWidth = 5 
    object.addChild(bGround) 

    let titleBG = SKShapeNode(rectOf: CGSize(width: 300, height: 100)) 
    if wColor == "blue"{ titleBG.fillColor = color.CSGOblue } 
    if wColor == "red"{ titleBG.fillColor = color.CSGOred } 
    if wColor == "pink"{ titleBG.fillColor = color.CSGOpink } 
    if wColor == "purple"{ titleBG.fillColor = color.CSGOpurple } 
    titleBG.strokeColor = color.gray 
    titleBG.lineWidth = 5 
    titleBG.position = CGPoint(x: 0, y: -150 + 50) 
    object.addChild(titleBG) 

    let weaponName = SKLabelNode() 
    weaponName.text = wName 
    weaponName.fontColor = color.white 
    weaponName.fontSize = 40 
    weaponName.fontName = "Avenir-Regular" 
    weaponName.verticalAlignmentMode = .center 
    weaponName.position = CGPoint(x: 0, y: -150 + 70) 
    object.addChild(weaponName) 

    let weaponSkin = SKLabelNode() 
    weaponSkin.text = wSkin 
    weaponSkin.fontColor = color.white 
    weaponSkin.fontSize = 20 
    weaponSkin.fontName = "Avenir-Regular" 
    weaponSkin.verticalAlignmentMode = .center 
    weaponSkin.position = CGPoint(x: 0, y: -150 + 30) 
    object.addChild(weaponSkin) 

    return object 
} 
+0

Fragen - Warum setzen Leute immer Tags in ihre Titel? –

+0

hmm? Ich glaube, ich habe meine Tags in den relevanten "Tags" -Abschnitt des Beitrags gesetzt – LuckyBowers

+0

Sie haben "Swift" zum Titel hinzugefügt. Es besteht keine Notwendigkeit, es ist bereits in den Tags angegeben, dass Sie Swift verwenden. –

Antwort

2

Eines der ersten Dinge, die Sie tun möchten, ist zu bestimmen, ob Ihr Die wahrgenommene Verzögerung ist real oder nicht, im Gegensatz zu dem Overhead der App, die gerade gestartet wird. 6 sec. Ist eine lange Zeitperiode, also ohne Messungen weiß man nicht, ob man die wahre Verzögerung übertreibt oder versteht. Ich werde verstehen, was ich meine, indem ich in wenigen wahrgenommen werde. Sie sollten tun, wie KnightOfDragon schlägt und tatsächlich die Zeit messen.

Ich sehe jetzt ein Problem mit dem Code, und es ist nicht ungewöhnlich für das, was ich mit dem Code der Leute sehe, der SK auf SO verwendet. Und dies geht in die oben erwähnte wahrgenommene Vorstellung. Die tatsächliche CPU-Auslastung, die für die Verarbeitung Ihrer Arbeit erforderlich ist, ist möglicherweise nicht groß. Die während der Laufzeit möglicherweise auftretende CPU-Auslastung stimmt jedoch nicht mit der tatsächlich erwarteten CPU-Auslastung überein. Warum? Sie machen wahrscheinlich eine Menge Arbeit am Hauptthread. Vom Laden des JSON zum möglichen Erstellen der Texturen. Als solches werden Sie feststellen, dass Sie durch das Verhungern des Hauptthreads Verlangsamungen sehen können, die Sie sonst nicht sehen würden. Das generalisierte Problem, App oder Spiel, ist, dass ich sehe, dass viele Leute versuchen, buchstäblich alles in ihre didMove oder wenn eine App viewDidLoad laden. Was Sie wirklich tun wollen, ist, dass Sie das eher wie einen Bootstrapping-Startpunkt behandeln. Führen Sie die minimale Menge an Arbeit dort aus, um einzurichten, und senden Sie asynchron die zeitraubenden Sachen mit Ihrer bevorzugten Methode. Dies wird Ihnen helfen, den Haupt-Thread zu sperren, während Sie Dinge wie Datei-I/O erledigen.

Ja, das macht Ihren Code ein wenig kompliziert, um damit umgehen zu können, aber das ist kein atypischer Ansatz. Die meisten Engines verfügen über Ladesysteme, die das Laden von Elementen im Hintergrund und das Benachrichtigen darüber erleichtern, wenn sie fertig sind. Während des Ladevorgangs sehen Sie normalerweise einen Ladebildschirm oder einen anderen Indikator.

Denken Sie daran, wenn Sie die SKNode Hierarchie ändern, müssen Sie sicherstellen, dass Sie es im richtigen Thread tun (zum Beispiel, wenn Sie addChild in der aktiven Szene). Sie können es entweder über eine SKAction oder über den Hauptthread tun. Ihre App kann sonst abstürzen.

+0

Vielen Dank für all das! Ich werde die Tests ausführen, die Sie vorgeschlagen haben, aber eine andere Sache, wenn ich die Texturen außerhalb meiner 'GameView.swift' Datei erzeugen sollte, die Zeile' let myTexture = view? .texture (from: object) 'Fehler wie es ist keine Ansicht in nur einer leeren Swift-Datei. Wie kann ich eine Textur aus einem SKNode erstellen? – LuckyBowers

+0

Ich bin mir nicht sicher, was du meinst. Sie müssen Ihre eigenen Texturen mit den von Ihnen gewünschten Mitteln laden. https://developer.apple.com/reference/spritekit/sktexture –

Verwandte Themen