2016-08-13 2 views
1

저는 SpriteKit에서 게임을 제작하고 있습니다. 최근 내 프레임 속도 문제가 60에서 50-45로 계속 떨어졌고 GameScene에서 열리고 두 번째 지연은 내 StartScene에서 GameScene. 나는 여러가지 것을 시도해 보았고, 주요 문제점 중 하나가 매우 자주 발생하는 SKSpriteNode 서브 클래스에 애니메이션을 적용하는 것과 관련이 있다고 믿습니다. 애니메이션을 멈추고 프레임 속도가 60으로 유지되는 단일 텍스처를 사용합니다. 이전에 posted 텍스처를 SpriteKit에 미리로드하는 방법에 대해 알아보고 멋진 답변을 얻었지만 완전히 이해하지 못했을 수 있습니다. 이 시점에서 나는 하나의 아틀라스 내 GameScene 모든 질감을 가지고 내 GameScene하기 전에 각 권리에 대한 상수를 만들어 그들 모두를로드미리로드 한 후 SpriteKit 장면 전환 지연 및 프레임 속도 저하

//Preload textures of GameScene before running it 
let alienTexture1 = SKTextureAtlas(named:"Sprites").textureNamed("alienTexture1") 
let alienTexture2 = SKTextureAtlas(named:"Sprites").textureNamed("alienTexture2") 
... 

class GameScene: SKScene, SKPhysicsContactDelegate { 

내가 사용하도록되어있어 알고 :

SKTextureAtlas(named: "YourTextureAtlasName").preloadWithCompletionHandler { 
// Now everything you put into the texture atlas has been loaded in memory 
} 
는 텍스처를 미리로드 할 수 있지만 괄호 사이에 때 let alienTexture1 = SKTextureAtlas(named:"Sprites").textureNamed("alienTexture1") 같은 라인을 호출하도록되어 간다 모르겠어요. 이 텍스처는 그 다음 내가 가지고있는 일부 외국인 SKSpriteNode 서브 클래스의 init의 내부이라고합니다. 예고가 명확하게 제대로 작동하지 않기 때문에 나는 무언가를 이해하지 못합니다. 나는 또한 GameScene로 전환 할 때 지연에 대해 할 모르겠어요하지만 그것은 또한 그 let의 모든 문장과 함께 시작 부분에 텍스처로드의 내 방식과 관련이있다 생각. 어떤 충고라도 잘 될 것입니다.

나는이 주제에 대한 다른 질문 보았다이 그것을 반복하지 않았다 충분히 특정 것을 느꼈다.

답변

0

나는 이것도 혼란 스러웠다. 전문가는 아니지만 본질적으로 텍스처를 미리로드한다는 것은 할당되지 않은 배열/속성에 텍스쳐를 저장한다는 것을 의미한다.

나는 (""). preloadWithCompletionHandler 방법을 SKTextureAtlas을 사용하여 정말 해달라고. 나는 그 생각이 기본적으로 같다고 믿는다.

예를 들어, 당신은

class Textures { 

     static var alien1 = [SKTexture]() // array off all alien 1 textures 


     static func preloadAll() { 
      loadAlien1() 
      ... 
     } 

     // Alien 1 
     static func loadAlien1() { 

      // Get atlas 
      let alien1AtlasName = "Your atlas name" 
      let alien1Atlas = SKTextureAtlas(named: alien1AtlasName) 

      // Loop through images in atlas and append to alienTexture property 
      // In this case there is 2 images in the atlas) 
      // Images should be appended by _1 , _2 etc 
      for image in 1...2 { 
       let textureName = "\(alien1AtlasName)_\(image)" 
       let texture = alien1Atlas.textureNamed(textureName) 
       alien1.append(texture) 
      } 
     } 
} 

앱이 AppDelegate에 또는 GameViewController에서 시작

는 텍스처를

Textures.preloadAll() 

당신은 텍스처가 많은 경우를 미리로드 정적 텍스처 로딩 클래스를 만들 수 있으며 원하는 메모리 사용량을 낮게 유지하면 처음에 필요로하는 텍스처를 미리로드하고 나중에 다른 레벨의 다른 텍스처를로드 할 수 있습니다.

Texture.loadAlien1() 

당신이 더 이상 또는 앱이 경우 필요하지 못했을 경우에 대비 당신이 당신의 텍스처를 청소해야하는 경우이

let textureAnimation = SKAction.animateWithTextures(Textures.alien1, timePerFrame: 0.3) 
alien1Sprite.runAction(SKAction.repeatActionForever(textureAnimation), withKey: "Alien1AnimationKey") 

처럼 서브 클래스 또는 SKScene에서 외국인 1 개 캐릭터에 애니메이션을 실행할 수 있습니다보다 배열을 비우라고 경고하는 메모리가 부족합니다. 성능에 관해서

Textures.alien1.removeAll() 

, 당신은 대신 프로젝트의 폴더, 엑스 코드 7의 새로운 기능입니다 엑스 코드 자산 카탈로그에 아틀라스를 저장해야합니다.

희망이 도움이되었습니다.