2015-01-05 2 views
1

카드 게임을 개발 중이며 52 장이 보이고 20 장이 보이고 나머지는 "스택"에 있습니다. 물리학은 없으며 특별한 것은 없으며 PNG 이미지가있는 SKSpriteNodes 만 있습니다. 내 iMAC에서 90 % CPU로 실행 중이며 iPhone 5S에서는 감동적인 반응이 나타날 때까지 1 초당 "느낌"을 보입니다. 한 장면에 너무 많은 SKSpriteNodes가있는 것이 문제입니까? 또는 .22의 scaleFactor가 문제가 될 수 있습니까?한 장면에 몇 개의 SKNode가 있습니까? 내 실적이 그렇게 나쁜 이유는 무엇입니까?

내 실수는 어디에서 왔습니까? 여기

나는 카드를 그냥 당신이 모든 스프라이트를 추가하고 업데이트 방법에 장면을 설정하는 것 같습니다 눈치 좋아

class PlayingCardView : SKSpriteNode { 

    init(imageNamed: String, cardIndex: Int) { 
     let cardTexture = SKTexture(imageNamed: imageNamed) 
     let cardScaleFactor:CGFloat = 0.22 
     let cardSize = CGSizeMake(cardTexture.size().width * cardScaleFactor,cardTexture.size().height * cardScaleFactor) 
     super.init(texture: cardTexture, color: nil, size: cardSize) 
     self.name = "\(cardIndex)" 
    } 
} 

// MARK: UpdateUI 
func updateUI() { 
     assert(game.cards.count > 0, "No Cards") 
     if status == GameIs.Paused {return} 
     removeAllCards() 
     PlayingCardViews.removeAll(keepCapacity: false) 

     var scaleFactor:CGFloat = 0.8 
     var upOffset:CGFloat = 0.0 
     var cardsLeft = 0 

     // create spritenotes for all 52 cards 
     for i in 0..<game.cards.count { 
      let card = game.cardAtIndex(i) 
      // all cards until cardPositions.count face up. the rest on the stack 
      var (x,y) = (7,6) 
      if i<cardPositions.count { 
       (x,y) = cardPositions[i] 
      } 
      // determine real position from the grid information 
      let xPos:CGFloat = realXForPositionX(x) 
      let yPos:CGFloat = realYForPositionY(y) 
      let image = backgroundImageForCard(card) 
      // we save the currents positon in the Model 
      card.positionGrid = (x,y) 
      let cardSprite = PlayingCardView(imageNamed: backgroundImageForCard(card), cardIndex:i) 
      PlayingCardViews.append(cardSprite) 
      if !card.removed { 
       cardSprite.position = CGPointMake(realXForPositionX(x),realYForPositionY(y)) 
       cardLayer.addChild(cardSprite) 
       ++cardsLeft 
      } 
     } 
     if cardsLeft == 0 { gameOver(0, timeLeft: secondsLeft) } 
    } 
+0

동시에 화면에 52 개의 스프라이트를 표시 할 수 있어야하지만, 실제로 수행하는 작업에 따라 다릅니다. 장면이로드 될 때 처음부터 성능 문제가 시작됩니까? 또한 얼마나 많은 메모리를 사용하고 있습니까? –

+0

예, 처음부터 시작됩니다. 나는 아무 것도하지 않는다. 그냥 터치 이벤트를 기다리고 있습니다. 메모리는 약 100MB입니다 –

+1

어디에서 updateUI() 메서드를 호출합니까? 화면에 많은 노드가 표시됩니까? – ZeMoon

답변

1

레이아웃! setup() 메서드를 만들고 스프라이트를 추가 한 다음 설정을해야합니다. 그렇지 않으면 초당 60 번 호출됩니다.

didMoveToView (한 번만 호출 됨)에서 사용자 지정 설치 방법을 호출 한 다음 게임 플레이에 필요한대로 카드를 이동하거나 업데이트하기 위해 코드를 호출하십시오.

+0

실제로 updateUI라고하는 다른 메서드이며 재정의 된 업데이트 메서드는 아닙니다. ZeMoon과 같이 – ZeMoon

+0

은 터치 이벤트에서만 호출되는 메서드입니다. 그러나 PlayCardViews { playingCardView.removeFromParent() } }에서 playingCardView에 대해 func removeAllCards() { }을 수행하여 카드를 제거하는 것이 250ms 지연을 일으키는 것으로 나타났습니다. –

관련 문제