Задержка при вызове SKLabelNode?

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

Кто-нибудь еще замечал это, это менее очевидно, когда вы просто используете один SKScene (например, шаблон по умолчанию), поскольку замедление просто теряется в обычной задержке запуска. Кто-нибудь знает способ обойти это, есть ли способ предварительно загрузить шрифт? Думаю, я мог бы загрузить шрифт на UIViewController при запуске и посмотреть, смогу ли я получить к нему доступ с помощью SKScene, у кого-нибудь есть идеи?

-(id)initWithSize:(CGSize)size {
    if (self = [super initWithSize:size]) {
        [self setScore:0];

        [self setBackgroundColor:[SKColor blackColor]];
        SKLabelNode *labelNode = [SKLabelNode labelNodeWithFontNamed:@"System"];
        [labelNode setText:@"00000"];
        [labelNode setFontSize:20.0];
        [labelNode setPosition:CGPointMake(CGRectGetMidX(self.frame),500)];
        [labelNode setName:@"SCORE"];
        [labelNode setAlpha:1.0];
        [self addChild:labelNode];
        [self setScoreLabel:labelNode];
        ...

person fuzzygoat    schedule 04.12.2013    source источник
comment
Я заметил то же самое, хорошая находка.   -  person Dvole    schedule 29.03.2014
comment
У меня задержка не менее двух секунд на iPhone 5S.   -  person Distortum    schedule 26.06.2014
comment
Попробуйте предварительно загрузить свой шрифт в соответствии с этим ответом, не забудьте назначить строку в предварительной загрузке, иначе шрифт фактически не загрузится. Также закомментируйте свой SKLabelNode, вы можете обнаружить, что задержка где-то еще, может быть, загрузка изображения или что-то в этом роде? Шрифты должны загружаться быстро, например, вот мое время предварительной загрузки аудио и изображений... [FGAssets preloadAudio] 0,0023 секунды, [FGAssets preloadImages] 0,2730 секунды. Для аудио там около 30 файлов и довольно большой музыкальный файл. Для изображений я загружаю около 700 спрайтов (все из атласов). Примечание: это время работы на iPhone 5S.   -  person fuzzygoat    schedule 26.06.2014


Ответы (6)


Задержка зависит от загрузки вашего шрифта. Лучше всего предварительно загрузить шрифты, звуки и любые другие ресурсы, которые вы собираетесь использовать, чтобы у вас не было задержки при первом использовании.

Вы можете выполнить предварительную загрузку в настройках с помощью:

SKLabelNode *preload = [SKLabelNode labelNodeWithFontNamed:@"System"];
[preload setText:@"anything"]; 

Как отмечено в комментариях, предварительная загрузка нужна только при использовании шрифта, который недоступен через iOS.

person prototypical    schedule 05.12.2013
comment
Это правильно, но чтобы шрифт действительно загружался, вам также нужно установить текст. Вам нужно будет добавить [preload setText:@anything]; чтобы предварительная загрузка работала. - person fuzzygoat; 30.03.2014
comment
На самом деле System не является шрифтом, доступным на устройстве, и существует известная задержка, когда SKLabelNode получает несуществующее имя шрифта. Если вы предоставите ему фактическое имя шрифта (например, HelveticaNeue), вы не столкнетесь с задержкой, и вам не нужно предварительно загружать свой шрифт. - person cc.; 15.05.2015

Я заметил одну вещь: если вы не используете «настоящее» имя шрифта при создании SKLabelNode, вы получите упомянутую вами задержку. Поскольку «Система» не является фактическим названием шрифта, вы испытываете задержку. Попробуйте выбрать один из реальных шрифтов, перечисленных системой. (Например, попробуйте «HelveticaNeue» вместо «System».)

person cc.    schedule 14.05.2014

Обычный трюк с предварительной загрузкой заключается в создании «фиктивной» версии актива в вашем делегате приложения, который должен эффективно кэшировать пользовательский шрифт в вашем случае во время выполнения. Это также поможет определить, является ли это реальной проблемой или нет — существует множество способов появления заиканий, которые трудно эффективно отследить в Sprite Kit.

person Matt    schedule 04.12.2013

У меня была задержка в рендеринге SKScene, потому что я использовал несколько UIViewController для навигации по моему приложению, а не один UIViewController, представление которого является SKView; нашел ответ здесь. Как только я реорганизовал свой код для использования одного UIViewController, переход между SKScenes стал плавным.

Если это не ваша проблема, возможно, вы могли бы создать экземпляр SKScenes при загрузке вашего представления и выполнить какое-либо обновление содержимого сцены непосредственно перед переходом и представлением сцены.

person Bokoskokos    schedule 04.12.2013

Будьте осторожны, вы не загружаете полное семейство шрифтов. Если я загружу «Chalkboard SE», это займет 4-6 секунд и, похоже, сработает.

Но если я загружаю ChalkboardSE-Regular , это практически мгновенно ~ 100 мс или меньше.

Вот список фактических названий шрифтов, которые вы должны использовать: AcademyEngravedLetPlain

AlNile-жирный

АлНил

Американская пишущая машинка-Light

AmericanTypewriter-CondensedLight

AmericanTypewriter-CondensedBold

американскаяпишущая машинка

AmericanTypewriter-Condensed

Американская пишущая машинка-жирный шрифт

AppleЦветEmoji

AppleSDGothicНео-тонкий

AppleSDGothicNeo-UltraLight

AppleSDGothicNeo-SemiBold

AppleSDGothicNeo-Medium

AppleSDGothicNeo-Regular

AppleSDGothicНео-жирный

AppleSDGothicNeo-Light

АриалМТ

Arial-BoldItalicMT

Arial-курсивMT

Arial-BoldMT

ArialИврит-Bold

ArialИврит-Light

ArialИврит

ArialRoundedMTBold

Авенир-Хэви

Авенир-Косой

Авенир-Блэк

Авенир-Бук

Avenir-BlackOblique

Avenir-HeavyOblique

Авенир-Лайт

Avenir-MediumOblique

Авенир-Медиум

Авенир-ЛайтКосой

Авенир-Роман

Avenir-BookOblique

AvenirNext-MediumItalic

AvenirNext-Bold

AvenirNext-UltraLight

AvenirNext-DemiBold

AvenirNext-HeavyItalic

AvenirNext-Heavy

AvenirNext-Medium

AvenirNext-Italic

AvenirNext-UltraLight Italic

AvenirNext-BoldItalic

AvenirNext-Regular

AvenirNext-DemiBoldItalic

AvenirNextКонденсированный-Обычный

AvenirNextCondensed-MediumItalic

AvenirNextCondensed-UltraLight Italic

AvenirNextCondensed-UltraLight

AvenirNextCondensed-BoldItalic

AvenirNextCondensed-Italic

AvenirNextКонденсированная среда

AvenirNextCondensed-HeavyItalic

AvenirNextКонденсированный-тяжелый

AvenirNextCondensed-DemiBoldItalic

AvenirNextCondensed-DemiBold

AvenirNextCondensed-Bold

BanglaSangamMN

BanglaSangamMN-Bold

Баскервиль-Болд

Baskerville-SemiBold, курсив

Baskerville-Bold, курсив

Баскервиль

Baskerville-SemiBold

Baskerville-курсив

BodoniSvtyTwoITCTT-Book

BodoniSvtyTwoITCTT-Bold

BodoniSvtyTwoITCTT-BookIta

BodoniSvtyTwoOSITCTT-BookIt

BodoniSvtyTwoOSITCTT-Bold

BodoniSvtyTwoOSITCTT-Book

BodoniSvtyTwoSCITCTT-Книга

BodoniОрнаментыITCTT

BradleyHandITCTT-Bold

Классная доскаSE-Light

Классная доскаSE-Regular

Классная доскаSE-полужирный

Меловой Дастер

Кохинхин-Болд

Cochin-Bold, курсив

Кочин-курсив

Кочин

Медная тарелка

Копперплейт-Лайт

Копперплейт-жирный

Курьер

Курьер-Косой

Курьер-BoldOblique

Курьер-жирный

КурьерНовыйPSMT

КурьерНовыйPS-BoldMT

CourierNewPS-ItalicMT

CourierNewPS-BoldItalicMT

ДамаскЖирный

Дамаск

ДамаскСвет

ДамаскСредний

ДамаскПолужирный

Деванагари СангамМН

DevanagariSangamMN-Bold

Didot-Bold

Дидо-курсив

Дидо

DINAlternate-Bold

DINCondensed-Bold

ЕвфимияUCAS

EuphemiaUCAS-Bold

EuphemiaUCAS-курсив

Фарах

Футура-Медиум

Futura-CondensedMedium

Futura-MediumItalic

Futura-CondensedExtraBold

GeezaPro-Bold

GeezaPro

Грузия-полужирный курсив

Джорджия-жирный

Грузия-курсив

Грузия

ГиллСанс

GillSans-курсив

GillSans-Bold, курсив

ГиллСанс-Лайт

GillSans-Light, курсив

ГиллСанс-жирный

ГуджаратиSangamMN-Bold

ГуджаратиSangamMN

ГурмухиMN-Bold

ГурмухиМН

STHeitiSC-средний

STHeitiSC-Light

STHeitiTC-средний

STHeitiTC-Light

Helvetica-наклонная

Helvetica-Light

Гельветика-полужирный

Гельветика

Helvetica-BoldOblique

Helvetica-LightOblique

HelveticaNeue-BoldItalic

HelveticaNeue-Light

HelveticaNeue-курсив

HelveticaNeue-UltraLight Italic

HelveticaNeue-CondensedBold

HelveticaNeue-MediumItalic

HelveticaNeue-тонкий

HelveticaNeue-Medium

HelveticaNeue-ThinItalic

HelveticaNeue-LightItalic

HelveticaNeue-UltraLight

HelveticaNeue-Bold

HelveticaNeue

HelveticaNeue-CondensedBlack

ХираКакуПроН-W6

ХираКакуПроН-W3

ХираМинПроН-W6

ХираМинПроН-W3

HoeflerText-Regular

HoeflerText-черный курсив

HoeflerText-курсив

HoeflerText-черный

IowanOldStyle-Bold

IowanOldStyle-BoldItalic

IowanOldStyle-курсив

IowanOldStyle-Roman

Кайласа

Кайласа-жирный

КаннадаSangamMN

КаннадаSangamMN-Bold

кхмерсангаммн

Кохинор Деванагари-Свет

KohinoorDevanagari-Книга

Кохинор Деванагари-Медиум

ЛаоСангамMN

МалаяламСангамMN

МалаяламSangamMN-Bold

Марион-Регуляр

Марион-курсив

Марион-Болд

МаркерВойлочный тонкий

МаркерВойлочный широкий

Menlo-Bold, курсив

Менло-Регуляр

Менло-Болд

Менло-курсив

ДиванМишафи

Примечательно-жирный

Примечательно-свет

Оптима-Регуляр

Оптима-курсив

Оптима-Болд

Optima-BoldКурсивный

Оптима-ЭкстраБлэк

Ория СангамМН

OriyaSangamMN-Bold

Палатино-римский

Палатино-италийский

Палатино-Болд

Palatino-BoldItalic

Папирус-Конденсированный

Папирус

ВечеринкаПустьРавнина

SavoyeLetPlain

сингальский сангам MN

СингальскийSangamMN-Bold

SnellRoundhand-черный

SnellRoundhand-Bold

СнеллРаундхенд

Суперкларендон-Регуляр

Superclarendon-BoldItalic

Суперкларендон-Лайт

Superclarendon-BlackItalic

Суперкларендон-курсив

Superclarendon-LightItalic

Суперкларендон-жирный

Суперкларендон-Блэк

Условное обозначение

ТамилСангамMN

ТамилСангамMN-Bold

ТелугуСангамMN

ТелугуSangamMN-Bold

Тонбури-жирный

Тонбури

Тонбури-Лайт

TimesNewRomanPS-BoldItalicMT

TimesNewRomanPSMT

TimesNewRomanPS-BoldMT

TimesNewRomanPS-ItalicMT

Trebuchet-BoldItalic

ТребюшеМС

TrebuchetMS-Bold

TrebuchetMS-курсив

Verdana-полужирный курсив

Verdana-курсив

Вердана

Verdana-Bold

ZapfDingbatsITC

Запфино

См. https://gilesey.wordpress.com/2015/01/14/ios-spritekit-font-loading-times-of-sklabelnodes/

person GilesDMiddleton    schedule 16.01.2015

Я добавил этот метод в свой «AppDelegate.m»:

- (void)setupFonts
{
    SKLabelNode *preloadFontLabel = [SKLabelNode labelNodeWithFontNamed:@"cinnamonCake"];
    [preloadFontLabel setText:@"Preload"];
}

и вызвал его:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [self setupFonts];
    return YES;
}

Приложение не загружалось медленнее и работало во всем приложении безупречно. Нашел ответ здесь: SKLabelNode задерживает запуск приложения

person MB_iOSDeveloper    schedule 12.09.2014