Производительность рендеринга Sprite Kit с использованием плиток 16x16 против плиток 32x32?

Я сделал плиточную игру. Сейчас я провожу стресс-тестирование возможностей своего телефона, увеличивая количество узлов в сцене. В моих сценах есть вещи, основанные на физике, движения ИИ, система «День и ночь», частицы, которые появляются здесь и там, и множество других вещей, происходящих под капотом для моих сцен. Что я хочу знать, есть ли разница в производительности при использовании плиток 16x16, которые у меня есть сейчас, по сравнению с использованием плиток 32x32? Эти плитки в основном представляют собой просто изображение, которое было добавлено к сцене; у них нет никаких физических тел или чего-то еще в этом роде. У них есть свойства, которые я установил для них при создании карты в Tiled, но я не думаю, что это как-то влияет на производительность. Каждая карта имеет несколько слоев (фон, растительность, точки возрождения, здания, иногда еще несколько). Вот фрагмент кода рендеринга тайлов для 1 такого слоя:

        if([map propertiesForGid:tileGid][@"shrub"])
        {
            SKSpriteNode *tile = [layer tileAtCoord:coord];
            tile.name = @"vegShrub";
            [self addChild:tile];
        }
        else if([map propertiesForGid:tileGid][@"tree"])
        {
            SKNode *tile = [[Breakable alloc] initWithWhole:[atlas textureNamed:@"tree"] broken:[atlas textureNamed:@"tree-stump"]];
            tile.position = [self pointForCoord:coord];
            [self addChild:tile];
            [layer removeTileAtCoord:coord];
        }

Если я использую тайлы 32x32 вместо своих нынешних тайлов 16x16, смогу ли я каким-то образом освободить память или «снять нагрузку» с системы?


person Krekin    schedule 12.06.2015    source источник
comment
Вероятно, это не будет иметь значения, поскольку вы будете рисовать одинаковое количество пикселей (скорость заполнения). Это может иметь значение, если вы перечисляете спрайты тайлов в каждом кадре и имеете неэффективность в этом цикле рендеринга, или вы делаете сумасшедшие вещи с каждым спрайтом в каждом кадре.   -  person LearnCocos2D    schedule 15.06.2015


Ответы (1)


В картах тайлов каждый тайл обычно представлен SKSpriteNode. Итак, если ваша карта имеет размер 320 x 320 и вы используете тайлы 32 x 32, вы получите 100 узлов. Использование тайлов 16x16 на карте того же размера даст 400 узлов. Чем больше узлов, тем больше нагрузка.

С другой стороны, вам следует изучить возможность получения SKAToolKit для анализа карт листов в вашем приложении. Он с открытым исходным кодом, бесплатный и имеет множество встроенных функций, таких как автоматическое отслеживание, мини-карта и т. д.

person sangony    schedule 12.06.2015
comment
Я думаю, что ваша логика тверда, и я согласен с вами. Что касается ссылки, которую вы прикрепили... БЛЯДЬ! Это именно то, что мне было нужно и даже больше! Спасибо большое. - person Krekin; 12.06.2015
comment
@Krekin - рад помочь. - person sangony; 12.06.2015
comment
Обратите внимание, что SKATiledMap на самом деле также создает SKSpriteNode для каждого тайла, что является очень неэффективным способом рендеринга карты. Если вам нужна более высокая производительность (и более полная поддержка функций Tiled), попробуйте TilemapKit — tilemapkit.com. - person Thorbjørn Lindeijer; 12.06.2015
comment
@ThorbjørnLindeijer Love Tiled и спасибо за создание такого замечательного продукта. Я разработчик SKATK и хотел бы больше рассказать о том, что вам нравится/не нравится, поскольку SKATiledMap создан для работы с вашим продуктом. Ссылка, которую вы указали в разделе кредитов, TilemapKit — это проект разочарованных разработчиков игр с тайловыми картами Штеффена Иттерхейма (он же LearnCocos2D, автор Learn Cocos2D и Learn SpriteBuilder) и Маркуса Любчика. По той же причине я делал вещи SKA. Не стесняйтесь писать мне по электронной почте, чтобы обсудить за пределами SO. SKATK предназначен не только для Tiled, но я хотел бы сделать лучший набор инструментов для разработчиков Sprite Kit. - person Skyler Lauren; 13.06.2015
comment
@ ThorbjørnLindeijer Не могли бы вы более подробно объяснить, почему очень неэффективно связывать один SKSpriteNode для каждой плитки? - person Dominique Vial; 13.06.2015
comment
@ ThorbjørnLindeijer Спасибо за рекомендацию. Я слышал о TilemapKit. Зарегистрировался на форумах и следил за своим API. Но я разработчик игр с нулевым бюджетом. Так что, к сожалению, платить 49-99 долларов (я полагаю, что это ценовой диапазон, указанный вашей командой) в настоящее время для меня не может быть и речи. Но, может быть, однажды. - person Krekin; 13.06.2015
comment
@SkylerLauren Извините, я не хотел сказать, что мне не нравится SKATiledMap. Его функциональность просто казалась неполной (например, только ортогональные карты), а подход к рендерингу с узлом для каждого тайла не может быть самым быстрым способом. Конечно, я ценю, что вы сделали такую ​​библиотеку доступной бесплатно. Я свяжусь с вами вне SO. - person Thorbjørn Lindeijer; 13.06.2015
comment
@Domsware Использование одного SKSpriteNode для каждой плитки означает выделение множества небольших фрагментов памяти и создает много работы для серверной части рендеринга, при этом каждый узел имеет свои собственные преобразования, режимы наложения и т. д. Для быстрого рендеринга карты плитки вы нужно создать геометрическую сетку для каждого слоя/набора тайлов, которые необходимо визуализировать. Теперь я должен признать, что после быстрой проверки API SpriteKit я не сразу вижу способ сделать это. Я вижу, что такие вещи доступны в SceneKit... - person Thorbjørn Lindeijer; 13.06.2015
comment
@Krekin Я лично не разработчик TilemapKit. Я надеюсь, что они рассмотрят возможность сделать бесплатную версию доступной. - person Thorbjørn Lindeijer; 13.06.2015
comment
Я разработчик TilemapKit. 1) Боюсь, вы можете использовать спрайты для тайлов в Sprite Kit только в том случае, если вы хотите, чтобы карта могла анимировать или заменять тайлы во время выполнения. 2) TilemapKit отрисовывает только видимые плитки и сохраняет в пуле столько спрайтов, сколько необходимо для заполнения области рендеринга. 3) Настоящим узким местом iOS является скорость заполнения. 500 спрайтов, использующих одну и ту же текстуру, — это по-прежнему 1 вызов отрисовки, и это самое главное. 1 спрайт, покрывающий площадь 500 спрайтов, по-прежнему отрисовывает такое же количество пикселей, что в любом случае составляет, вероятно, 90% времени рендеринга. В OS X производительность рендеринга не является проблемой. - person LearnCocos2D; 15.06.2015
comment
Думая об этом, должна быть возможность визуализировать слой плитки на SKTexture и впредь использовать его с одним спрайтом для статического слоя. Это может сработать, хотя добавит некоторые накладные расходы на предварительную обработку и будет работать только в том случае, если результирующая текстура совместима с ограничением размера текстуры устройства (я думаю, что все устройства iOS 9 поддерживают текстуры до 4000x4000). - person LearnCocos2D; 15.06.2015
comment
Я протестировал бета-версию tilemapkit. Моя карта имеет размер 32x32 и 320x50, а набор tilemap отстой fps. Я наблюдал несколько лучшую производительность SKATK с помощью отбраковки, но на iphone 4s он по-прежнему дает около 40 кадров в секунду, что показывает небольшое отставание. Кто-нибудь может что-нибудь подсказать? - person Abhi; 10.09.2015