2013-10-26 3 views
1

Я строю простую игру с комплектом Sprite, в котором уровень построен из одинаковых прямоугольных блоков. Но когда я добавляю ко многим блокам (т. Е. 1000), игра становится очень медленной (FPS падает до 20). Вот как я добавляю блоки к сцене:Добавление такого же спрайта в SpriteKit

-(void)drawLevel 
{ 
    SKSpriteNode *shelf = [SKSpriteNode spriteNodeWithTexture:_initialLevel.earthBoxTexture]; 
    shelf.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:shelf.size]; 
    shelf.physicsBody.dynamic=NO; 
    shelf.physicsBody.categoryBitMask = platformCategory; 

    for (NSValue *positionValue in _initialLevel.boxPositions) 
    { 
     shelf.position = positionValue.CGPointValue; 
     [_platformsNode addChild:[shelf copy]]; 
    } 

    [_world addChild:_platformsNode]; 
} 

_world является ребенком главной сцены. Я создаю «полку» один раз и копирую ее. Как мне это сделать, чтобы получить хороший FPS?

App был протестирован на iPhone 5.

+0

Является ли это на устройстве или в симуляторе? Я думаю, что ответ дается правильно, но было бы полезно добавить эту информацию в вопрос. 20 кадров в секунду в симуляторе и 20 кадров в секунду на устройстве - очень разные ситуации. – prototypical

+0

Для решения, использующего только один узел, см. Http://stackoverflow.com/a/37768928/763355 – MoDJ

ответ

2

Как насчет не использовать это много спрайтов с физическими телами?

В тысячах определенно несколько сотен слишком много, особенно если они все на экране, и если многие из тел генерируют контактные события (то есть когда они сложены). Хотя в этом случае они все статичны, поэтому они не должны генерировать контактные события. Который все еще оставляет много спрайтов.

Любой код, который выполняется на всех или большинстве узлов, также ухудшит ситуацию. Только для справки, одно приложение, которое я рисую около 400 спрайтов на экране, обновляет их все, когда прокручивается и запускает пользовательскую логику игры - это приложение едва делает 60 кадров в секунду на iPod touch 5G.

Кроме того, не забудьте проверить характеристики устройства. Симулятор не может использоваться для оценки производительности.

+0

Спасибо за ваш ответ! Большинство этих блоков не находятся на экране (около 100 видимых на экране). Пока я тестирую его с отключенными контактами, но он все еще очень медленный. Поскольку эти блоки являются частью уровня, мне нужно, чтобы они не были проницаемыми - могу ли я сделать это без физического тела? – user2923525

0

Я бы рекомендовал использовать систему, которая использует карту листа спрайтов, которая сэкономит огромные ресурсы, если будет выполнена правильно. Убрать его немного сложно, но каждый раздел листа спрайтов можно установить как разные объекты, которые могут взаимодействовать с вашими спрайтами по-разному. Удачи, если вы все еще ищете способы решения этой проблемы, я все еще изучаю Tiled с помощью SpriteKit, но это кажется очень многообещающим.

http://www.raywenderlich.com/62049/sprite-kit-tutorial-make-platform-game-like-super-mario-brothers-part-1 - Учебник объяснения с использованием облицованы SpriteKit

http://www.mapeditor.org - сайт Плиточный