2015-05-24 3 views
4

Я создаю игру с комплектом спрайтов, и я использую файл plist для задания свойств каждого уровня. Одним из свойств в моем файле plist является словарь, называемый шаблонами, который содержит n элементов, где каждый из элементов является блоком, с ручной настройкой x и y позиций. Эта модель отлично работает для той игры, которую я делаю, так как очень удобно быстро устанавливать уровни. Тем не менее, я столкнулся с одним недостатком, который я не могу решить из-за отсутствия опыта кодирования: на некоторых уровнях есть до 290 блоков, поэтому, когда приложение пытается прочитать уровень, приложение замерзает примерно на 5 секунд. Это очень раздражает пользователя. Вначале мой подход: прочитать файл plist, и для каждого элемента вызов метода, который создает блок как SKSpriteNode, используя свой метод imageNamed. Я думал, что это причина, по которой она так сильно отстает, что я пытаюсь загрузить 300 спрайтов во время работы, как многообещающая причина проблемы. Затем я попробовал следующее: я сделал метод, который загружает пул блока изначально, когда игра начинается в первый раз. Это мой метод для этогоУлучшение производительности спрайтов Sprite kit

func addObsticles1ToPool() { 

    for i in 0...300 { 

     let element = SKSpriteNode(imageNamed: "obsticle1") 
     element.hidden = true 
     obsticle1Pool.append(element) 

    } 

} 

Тогда, мой код считывает файл Plist, и для каждого блока вызывает следующее:

func block(x: CGFloat, y: CGFloat, movingUp: Bool, movingSide: Bool, spin: Bool, type: Int16) { 

    var block: SKSpriteNode! 
    for obs in obsticle1Pool { 

     if obs.hidden { 

      block = obs 
      break 

     } 

    } 


    block.hidden = false 
    // Further down the properties of the block are set, such as actions it should perform depending on the input values, also its physics body is set. 

У меня также есть методы обработки, что новые элементы должны быть добавленным в пул, как игра, выручка и все, что работает очень хорошо. Время запаздывания сократилось примерно до 3,5-4 с, но это все еще недостаточно хорошо. Я хотел бы иметь игру без лаг. Однако я не уверен, есть ли другой, более эффективный способ делать то, что я пытаюсь сделать, чем использовать пул спрайтов. Кто-нибудь знает, как уменьшить это отставание?

+0

Добавить экран загрузки? –

+0

Простое решение, но это не в моих требованиях к пользовательскому интерфейсу:/ – TruniTr

+0

у вас предварительно загружены все изображения ур? – Wraithseeker

ответ

5

У меня была такая же проблема! Проблема заключается в этой строке ...

let element = SKSpriteNode(imageNamed: "obsticle1") 

SpriteKit не достаточно умен, чтобы знать, что текстура была уже создана с этим изображением. Итак, что он делает, это создание этой текстуры снова и снова, и это дорого.

Вместо этого сначала создайте текстуру за пределами цикла, а затем создайте узел спрайта с текстурой. Что-то вроде этого ...

let elementTexture = SKTexture(imageNamed: "objstical1") 

for i in 0...300 { 

    let element = SKSpriteNode(texture: elementTexture) 
    element.hidden = true 
    obsticle1Pool.append(element) 

} 

Не только это будет тонна быстрее это уменьшит ваши приложения памяти тонны ... предполагая, что это был тот же вопрос, который я имел. Надеюсь, это поможет.

+0

Спасибо, это действительно помогает! – TruniTr

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