Ios 创建Spritodes时,Swift游戏会滞后

Ios 创建Spritodes时,Swift游戏会滞后,ios,swift,Ios,Swift,因此,我最近上传了一个游戏到应用商店,一直有用户报告旧设备的延迟。 首先,游戏: 它被称为“曲线”(我不确定我是否被允许在这里张贴它的名字,但这会帮助你理解这个问题)。这个游戏的理念是一个球在屏幕上移动,并通过墙之间的缝隙。还有一些较小的球从主球上落下,从而形成某种路径。 现在,落后了。它们发生在两个主要时刻。首先,当路径被创建时,第二,当玩家通过间隙时。 当玩家通过间隙时,他与一个不可见的节点碰撞。记录对话,更新分数。然后移除节点,播放器继续。 我相信当swift创建或删除一个SpriteNo

因此,我最近上传了一个游戏到应用商店,一直有用户报告旧设备的延迟。 首先,游戏: 它被称为“曲线”(我不确定我是否被允许在这里张贴它的名字,但这会帮助你理解这个问题)。这个游戏的理念是一个球在屏幕上移动,并通过墙之间的缝隙。还有一些较小的球从主球上落下,从而形成某种路径。 现在,落后了。它们发生在两个主要时刻。首先,当路径被创建时,第二,当玩家通过间隙时。 当玩家通过间隙时,他与一个不可见的节点碰撞。记录对话,更新分数。然后移除节点,播放器继续。 我相信当swift创建或删除一个SpriteNode时,就会出现滞后。关于如何处理这个问题有什么想法吗

这是我在制造障碍时使用的代码——我认为这就是问题所在

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)
}

你的方法听起来很相似,但我在那里一点也不落后。SpriteKit速度非常快,但可能是您的确切情况导致了问题。检查事项:

1) 您正在使用纹理地图集吗?这些图像比捆绑包中的单独图像加载更快

2) 如果您经常使用图像,是否可以将它们存储在
SKTexture
中,然后从那里加载节点

3) 还有其他事情发生吗,比如声音播放?iOS模拟器在游戏中播放第一个声音时,通常会有短暂的延迟


4) 创建的路径非常复杂吗?

事实上,我已经用你的讲座开始学习Swift=)顺便说一句,非常感谢。你的演讲是世界上最有帮助的事了)现在,对于问题1)我没有使用地图集。实际上,我认为当多个节点一起移动时,它们最有用,而我一直在创建单个节点2)我不使用任何图像。我的所有节点都是游戏创建的简单图形(圆和正方形)。我这样做是因为我需要在游戏中经常改变它们的颜色3)我在你的讲座中读到了这个问题,所以我在游戏开始时插入了一个无声的声音4)不,只是有很多小圆圈从玩家身上掉落,从而创建了一条“路径”,我很高兴我的教程很有用!正如您所了解的,您可能还记得,在中,我们使用雪碧颜色混合来绘制具有不同颜色的相同雪碧-这是最有效的方法。如果您的精灵除了颜色之外都是相同的,您可能会发现这有助于缓解性能问题。那么“路径”呢?在这里,所有节点都是相同的,但仍然会导致延迟。还有,当你得到一分的时候,会发生什么样的延迟呢。这本身并不是一个延迟,玩家只需向下移动几个像素,然后回到初始高度(我猜,当不可见节点消失时)。听起来你的路径非常简单,不太可能导致任何性能问题,所以我排除了这种可能性。