2017-11-08 7 views
0

Entschuldigung im Voraus, da ich nicht sicher bin, was genau die richtige Frage ist. Die Probleme, die ich letztlich zu Adresse versuchen, sind:Einfache SpriteKit Spiel Leistungsprobleme - Swift

1) Spiel bekommt laggy manchmal

2) CPU% hoch bekommen, so viel wie 50-60% zu Zeiten, ist aber auch manchmal relativ niedrig (< 20%)

3) Gerät (iPhone 6s) kann leicht warm

ich glaube, was die lagginess fährt, ist, dass ich immer bin zu schaffen und Kreise in der SKScene zu entfernen. Es ist ziemlich unvermeidlich, weil die Kreise ein kritisches Element für das Spiel sind und ich ständig ihre Größe und Physik-Eigenschaften ändern muss, so dass ich nicht viel tun kann, was die Wiederverwendung von Knoten betrifft. Außerdem bewege ich fast ständig einen anderen Knoten.

func addCircle() { 

    let attributes = getTargetAttributes() //sets size, position, and color of the circle 


    let target = /*SKShapeNode()*/SKShapeNode(circleOfRadius: attributes.size.width) 
    let outerPathRect = CGRect(x: 0, y: 0, width: attributes.size.width * 2, height: attributes.size.width * 2) 

    target.position = attributes.position 
    target.fillColor = attributes.color 
    target.strokeColor = attributes.stroke 
    target.lineWidth = 8 * attributes.size.width/35 
    target.physicsBody = SKPhysicsBody(circleOfRadius: attributes.size.width) 

    addStandardProperties(node: target, name: "circle", z: 5, contactTest: ContactCategory, category: CircleCategory) //Sets physicsBody properties 

    addChild(target) 


} 

Die Funktion getAttributes() ist nicht zu teuer. Es hat eine while-Schleife, um die Position des Kreises festzulegen, wird aber normalerweise nicht verwendet, wenn die Funktion aufgerufen wird. Ansonsten ist es einfach Mathematik.

Einige andere Details:

1) Die App läuft auf einem konstanten 120 fps. Ich habe versucht, die Szene/Ansicht niedriger zu setzen, indem Sie view.preferredFramesPerSecond = 60 in GameScene.swift und gameScene.preferredFramesPerSecond = 60 in GameViewController hinzufügen. Keine von beiden ändert die fps. Normalerweise, wenn ich Leistungsprobleme in anderen Apps hatte, sind die fps gesunken, aber das passiert hier nicht.

2) Ich habe versucht, den SKShapeNode Initialisierer zu wechseln, um einen Pfad gegen CircleOfRadius zu verwenden und dann den Pfad zurückzusetzen. Ich habe aber auch Bilder probiert, da ich den physicsBody zurücksetzen muss, da scheint es keinen Leistungsgewinn zu geben.

3) Ich habe versucht, die physicsWorld Geschwindigkeit zu ändern, aber dies hatte auch wenig Wirkung.

4) Ich habe auch Instrumente verwendet, um das Problem zu identifizieren. Es gibt große Ressourcen, die von SKRenderer benutzt werden, aber ich kann nicht viele Informationen darüber finden.

+0

SKShapeNodes sind ineffizient und sollten sparsam verwendet werden. Ich würde empfehlen, 1 Kreis zu erstellen und skalieren Sie es einfach – Knight0fDragon

Antwort

2

Erstellen SKShapeNodes sind ineffizient, versuchen Sie es so oft wie möglich zu verwenden. Erstellen Sie stattdessen eine Vorlagenform und konvertieren Sie sie in eine SKSpriteNode.

Wenn Sie die Größe ändern müssen, dann verwenden xScale und yScale, wenn Sie die Farbe ändern müssen, dann color verwenden mit colorBlendFactor von 1

Wenn Sie einen unterschiedlichen Farb Schlaganfall haben müssen, dann die Änderung unter dem Code 2 SKSpriteNodes, 1 SKSpriteNode, die nur die Füllung behandelt, und 1 SKSpriteNode, die nur den Strich behandelt. Lassen Sie das Strich-Sprite ein Kind des Füll-Sprites mit einer zPosition von 0 werden und stellen Sie die Strichfarbe auf weiß ein. Sie können dann die color und colorBlendFactor auf den untergeordneten Knoten des Kreises anwenden, um die Farbe zu ändern.

lazy var circle = 
{ 
    let target = SKShapeNode(circleOfRadius: 1000) 
    target.fillColor = .white 
    //target.strokeColor = .black //if stroke is anything other than black, you may need to do 2 SKSpriteNodes that layer each other 
    target.lineWidth = 8 * 1000/35 

    let texture = SKView().texture(from:target) 
    let spr = SKSpriteNode(texture:texture) 
    spr.physicsBody = SKPhysicsBody(circleOfRadius: 1000) 
    addStandardProperties(node: spr, name: "circle", z: 5, contactTest:ContactCategory, category: CircleCategory) //Sets physicsBody properties 
    return spr 
}() 

func createCircle(of radius:CGFloat,color:UIColor) -> SKSpriteNode 
{ 
    let spr = circle.copy() 
    let scale = radius/1000.0 
    spr.xScale = scale 
    spr.yScale = scale 
    spr.color = color 
    spr.colorBlendFactor = 1.0 
    return spr 

} 

func addCircle() { 

    let attributes = getTargetAttributes() //sets size, position, and color of the circle 
    let spr = createCircle(of:attribute.width,color:attributes.color) 
    spr.position = attributes.position 
    addChild(str) 
} 
+0

In voller Offenlegung, habe ich nicht versucht, diese genaue Lösung, aber aus Gründen der Einfachheit für den Code, den ich bereits habe ich versucht 1) mit xScale und yScale mit der gleichen SKShapeNode (d.(nicht viele SKShapeNodes erstellen) und 2) SKSpriteNodes anstelle von SKShapeNodes verwenden, aber das Texturbild (d. h. Farbe) jedes Mal ersetzen. Das Erstellen mehrerer Knoten hat zwar nicht geholfen, aber die CPU-Auslastung beträgt immer noch 30-50% (möglicherweise eine 10% ige Verbesserung). Tatsächlich ist die CPU-Auslastung unmittelbar nach dem Einrichten der Szene ziemlich hoch, aber bevor irgendetwas anfängt sich zu bewegen oder in Echtzeit hinzugefügt wird. Gibt es noch andere offensichtliche Bereiche? – SuperCodeBrah

+0

Außerdem zeige ich im SKView 60 FPS, wenn ich im Debug-Navigator 'showsFPS = true' aber 120 FPS hinzufüge. Könnte es da Probleme geben? Und ein letztes Detail, wenn ich die App öffne und zu ihrem ursprünglichen View-Controller gehe, wird die CPU-Auslastung bei 0% bleiben, wenn ich nichts mache. Wenn ich zum GameViewController übergehe, spitalisiert es sich, aber wenn ich dann zum ursprünglichen View-Controller zurückkehre, kehrt die CPU-Nutzung nicht auf 0% zurück, sondern liegt bei ungefähr 12-15%. Was könnte das bedeuten? – SuperCodeBrah

+0

Nein, nicht sicher, warum Sie sehen 120FPS nur das neueste iPad unterstützt, dass ich dachte – Knight0fDragon

Verwandte Themen