Итак, я недавно загрузил игру в магазин приложений и стал сообщать о задержках на старых устройствах. Прежде всего, игра: Это называется «CURVE» (я не уверен, что мне разрешено публиковать его имя здесь, но это поможет вам разобраться в проблеме). Идея игры в том, что мяч перемещается вверх по экрану и проходит в промежутках между стенами. Также есть меньшие шары, которые падают от основного, создавая тем самым какой-то путь. Теперь лаги. Они происходят в два основных момента. Во-первых, когда путь создается и во-вторых, когда игрок проходит через промежутки. Когда игрок проходит через промежутки, он сталкивается с невидимым узлом. Столкновение отмечено, оценка обновляется. Затем узел удаляется, и игрок продолжает работу. Я считаю, что задержки происходят, когда swift либо создает SpriteNode, либо удаляет его. Любые идеи относительно того, как справиться с этой проблемой?Быстрая игра отстает при создании spritenodes
Вот код, я использую, когда нерест мои препятствия - я думаю, что это где проблема
func createRocks() {
rockHeight = (frame.height * (heightOfRocks))
if gameState != .Dead {
switch spawnCount {
case 10:
levelUp()
case 20:
levelUp()
case 30:
levelUp()
case 40:
levelUp()
case 50:
levelUp()
case 60:
levelUp()
case 70:
levelUp()
case 80:
levelUp()
case 90:
levelUp()
case 100:
levelUp()
case 110:
levelUp()
case 120:
levelUp()
case 130:
levelUp()
case 140:
levelUp()
case 150:
levelUp()
default:
break
}
}
++spawnCount
let leftRock = SKShapeNode(rectOfSize: CGSize(width: (frame.width), height: (rockHeight)), cornerRadius: (cornerRad))
leftRock.fillColor = themeColor
leftRock.strokeColor = themeBorderColor
leftRock.lineWidth = themeBorderWidth
leftRock.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: ((frame.width) + (themeBorderWidth)), height: ((rockHeight) + (themeBorderWidth))))
leftRock.physicsBody?.dynamic = false
let rightRock = SKShapeNode(rectOfSize: CGSize(width: (frame.width), height: (rockHeight)), cornerRadius: (cornerRad))
rightRock.fillColor = themeColor
rightRock.strokeColor = themeBorderColor
rightRock.lineWidth = (themeBorderWidth)
rightRock.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: ((frame.width) + (themeBorderWidth)), height: ((rockHeight) + (themeBorderWidth))))
rightRock.physicsBody?.dynamic = false
leftRock.zPosition = CGFloat(10 + (21 * levelNumber))
rightRock.zPosition = CGFloat(10 + (21 * levelNumber))
// 2
let rockCollision = SKSpriteNode(color: UIColor.clearColor(), size: CGSize(width: (frame.width * 2), height: 32))
rockCollision.physicsBody = SKPhysicsBody(rectangleOfSize: rockCollision.size)
rockCollision.physicsBody?.dynamic = false
rockCollision.name = "scoreDetect"
addChild(leftRock)
addChild(rightRock)
addChild(rockCollision)
// 3
let rockWidth = frame.width
let yPosition = frame.height + leftRock.frame.height
let rockDistance = frame.width * (gapWidth)
let min = Int(((frame.width) * (wallWidth)) - (rockWidth/2))
let max = Int(((frame.width) * (1.00 - ((wallWidth)))) - rockDistance - (rockWidth/2))
let rand = min + Int(arc4random_uniform(UInt32(max - min)))
//GKRandomDistribution(lowestValue: min, highestValue: max)
let xPosition = CGFloat(rand)
// 4
leftRock.position = CGPoint(x: xPosition, y: yPosition)
rightRock.position = CGPoint(x: xPosition + rockWidth + rockDistance, y: yPosition)
rockCollision.position = CGPoint(x: xPosition, y: CGRectGetMidY(frame))
rockCollision.position = CGPoint(x: CGRectGetMidX(frame), y: yPosition + (rockCollision.size.height * 2))
let endPosition = frame.height + (leftRock.frame.height * 2)
let moveAction = SKAction.moveByX(0, y: -endPosition, duration: timeOfRockMovement)
let moveSequence = SKAction.sequence([moveAction, SKAction.removeFromParent()])
leftRock.runAction(moveSequence)
rightRock.runAction(moveSequence)
rockCollision.runAction(moveSequence)
}
func initRocks() {
let create = SKAction.runBlock { [unowned self] in
self.createRocks()
}
let wait = SKAction.waitForDuration(rockSpawnWait)
let sequence = SKAction.sequence([create, wait])
let repeatForever = SKAction.repeatActionForever(sequence)
runAction(repeatForever)
}
На самом деле, я использовал ваши лекции, чтобы начать изучать Swift =) Кстати, большое вам спасибо. Ваши лекции - самая полезная вещь в мире =) Теперь на вопрос 1) Я не пользуюсь атласами. Я на самом деле думал, что они наиболее полезны, когда несколько узлов движутся вместе, в то время как я все время создавал одиночные узлы 2) Я не использую никаких изображений. Все мои узлы - это простые фигуры, созданные игрой (круги и квадраты). Я сделал это, потому что мне нужно много менять цвета в игре –
3) Я читал об этой проблеме на ваших лекциях, поэтому я только что вставил тихий звук в начале игры 4) Нет, это просто много круги, падающие от игрока, создавая таким образом «путь» –
Я рад, что мои уроки полезны! Как вы следовали за ними, вы можете вспомнить, что в [проект 20] (https://www.hackingwithswift.com/read/20/overview) мы использовали смешивание цветов спрайтов, чтобы рисовать один и тот же спрайт с разными цветами - это самый эффективный способ сделать это. Если ваши спрайты не отличаются от их цвета, вы можете обнаружить, что это помогает смягчить вашу проблему с производительностью. – TwoStraws