2015-12-13 9 views
0

Итак, я недавно загрузил игру в магазин приложений и стал сообщать о задержках на старых устройствах. Прежде всего, игра: Это называется «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) 
} 

ответ

0

Ваш подход звучит очень похоже на a SpriteKit tutorial I wrote, но у меня не было отставание на всех там. SpriteKit ужасно быстро, но возможно, что ваши точные условия вызывают проблемы. Что нужно проверить:

1) Используете ли вы текстурные атласы? Они быстрее загружаются, чем отдельные изображения в вашем комплекте.

2) Если вы многократно используете изображения, можете ли вы сохранить их в SKTexture, а затем загрузите свои узлы?

3) Есть ли другие вещи, такие как звуки? У iOS Simulator часто есть короткий лаг, когда он воспроизводит свой первый звук в игре.

4) Является ли путь, который создается очень сложным?

+0

На самом деле, я использовал ваши лекции, чтобы начать изучать Swift =) Кстати, большое вам спасибо. Ваши лекции - самая полезная вещь в мире =) Теперь на вопрос 1) Я не пользуюсь атласами. Я на самом деле думал, что они наиболее полезны, когда несколько узлов движутся вместе, в то время как я все время создавал одиночные узлы 2) Я не использую никаких изображений. Все мои узлы - это простые фигуры, созданные игрой (круги и квадраты). Я сделал это, потому что мне нужно много менять цвета в игре –

+0

3) Я читал об этой проблеме на ваших лекциях, поэтому я только что вставил тихий звук в начале игры 4) Нет, это просто много круги, падающие от игрока, создавая таким образом «путь» –

+0

Я рад, что мои уроки полезны! Как вы следовали за ними, вы можете вспомнить, что в [проект 20] (https://www.hackingwithswift.com/read/20/overview) мы использовали смешивание цветов спрайтов, чтобы рисовать один и тот же спрайт с разными цветами - это самый эффективный способ сделать это. Если ваши спрайты не отличаются от их цвета, вы можете обнаружить, что это помогает смягчить вашу проблему с производительностью. – TwoStraws

Смежные вопросы