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.
SKShapeNodes sind ineffizient und sollten sparsam verwendet werden. Ich würde empfehlen, 1 Kreis zu erstellen und skalieren Sie es einfach – Knight0fDragon