调用SKLabelNode时出现延迟?

4
我在从一个SKScene转换到另一个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];
        ...

我也注意到了,不错的发现。 - Dvole
我在iPhone 5S上至少有两秒的延迟。 - Steve
尝试按照此答案预加载字体,不要忘记在预加载中分配一个字符串,否则字体实际上不会被加载。同时注释掉你的SKLabelNode,你可能会发现延迟出现在其他地方,比如图片加载等等?字体应该很快就能预加载完成,例如这里是我的音频和图像预加载时间... [FGAssets preloadAudio] 0.0023秒,[FGAssets preloadImages] 0.2730秒。对于音频,大约有30个文件和一个相当大的音乐文件。对于图像,我加载了大约700个精灵(全部来自图集)。注意:这些时间是在iPhone 5S上运行的。 - fuzzygoat
6个回答

4
延迟是基于字体的加载。最好预先加载字体、声音和其他你想使用的资源,这样当它们首次被使用时就不会有延迟。
你可以在设置中使用以下代码进行预加载:
SKLabelNode *preload = [SKLabelNode labelNodeWithFontNamed:@"System"];
[preload setText:@"anything"]; 

正如评论中所指出的,只有在使用iOS不支持的字体时才需要预加载。


3
这是正确的,但要使字体真正加载,您还需要设置文本。您需要添加 [preload setText:@"anything"]; 以使预加载工作。 - fuzzygoat
实际上,“System”不是设备上可用的字体,而且已知当SKLabelNode被赋予一个不存在的字体名称时会有延迟。如果您提供一个实际的字体名称(例如“HelveticaNeue”),您就不会遇到延迟,并且您也不需要预加载字体。 - cc.

4

我发现如果你在创建SKLabelNode时不使用“真实”的字体名称,你会遇到你提到的延迟问题。因为“System”不是一个真正的字体名,所以你会遇到延迟。尝试选择系统列出的实际字体之一(例如,尝试使用“HelveticaNeue”而不是“System”)。


1
通常的预加载技巧是在您的应用程序委托中创建一个"虚拟"版本的资产,这将在运行时有效地缓存自定义字体。这也有助于确定是否存在真正的问题 - 在Sprite Kit中引入卡顿的方式有很多,很难有效地追踪下来。

1
我在SKScene渲染时遇到了延迟,因为我使用了多个UIViewControllers来浏览我的应用程序,而不是使用一个单独的UIViewController,其视图是SKView;在这里找到了答案。一旦我重构了代码,使用单个UIViewController过渡到SKScenes变得无缝。
如果这不是你的问题,也许你可以在视图加载时实例化你的SKScenes,并在转换和呈现场景之前对场景内容进行任何更新。

1
请注意,不要加载整个字体族。如果我加载“Chalkboard SE”,需要4-6秒钟才能显示出来。
但是,如果我只加载ChalkboardSE-Regular,则几乎瞬间就可以显示出来,大约100毫秒或更少。
以下是您应该使用的实际字体名称列表:
AcademyEngravedLetPlain
AlNile-Bold
AlNile AmericanTypewriter-Light
AmericanTypewriter-CondensedLight
AmericanTypewriter-CondensedBold
AmericanTypewriter AmericanTypewriter-Condensed
AmericanTypewriter-Bold
AppleColorEmoji
AppleSDGothicNeo-Thin
AppleSDGothicNeo-UltraLight
AppleSDGothicNeo-SemiBold
AppleSDGothicNeo-Medium
AppleSDGothicNeo-Regular AppleSDGothicNeo-Bold
AppleSDGothicNeo-Light
ArialMT
Arial-BoldItalicMT
Arial-ItalicMT

Arial-BoldMT

ArialHebrew-Bold

ArialHebrew-Light

ArialHebrew

ArialRoundedMTBold

Avenir-Heavy

Avenir-Oblique

Avenir-Black

Avenir-Book

Avenir-BlackOblique

Avenir-HeavyOblique

Avenir-Light

Avenir-MediumOblique

Avenir-Medium

Avenir-LightOblique

Avenir-Roman

Avenir-BookOblique

AvenirNext-MediumItalic

AvenirNext-Bold

AvenirNext-UltraLight

AvenirNext-DemiBold

AvenirNext-HeavyItalic

AvenirNext-Heavy

AvenirNext-Medium

AvenirNext-Italic

AvenirNext-UltraLightItalic

AvenirNext-BoldItalic

AvenirNext-Regular

AvenirNext-DemiBoldItalic

AvenirNextCondensed-UltraLightItalic

AvenirNextCondensed-UltraLight

AvenirNextCondensed-BoldItalic

AvenirNextCondensed-Italic

AvenirNextCondensed-Medium

AvenirNextCondensed-HeavyItalic

AvenirNextCondensed-Heavy

AvenirNextCondensed-DemiBoldItalic

AvenirNextCondensed-DemiBold

AvenirNextCondensed-Bold

BanglaSangamMN

BanglaSangamMN-Bold

Baskerville-Bold

Baskerville-SemiBoldItalic

Baskerville-BoldItalic

Baskerville

Baskerville-SemiBold

Baskerville-Italic

BodoniSvtyTwoITCTT-Book

BodoniSvtyTwoITCTT-Bold

BodoniSvtyTwoITCTT-BookIta

BodoniSvtyTwoOSITCTT-BookIt

BodoniSvtyTwoOSITCTT-Bold

BodoniSvtyTwoOSITCTT-Book

BodoniSvtyTwoSCITCTT-Book

BodoniOrnamentsITCTT

BradleyHandITCTT-Bold

ChalkboardSE-Light

ChalkboardSE-Regular

ChalkboardSE-Bold

Chalkduster

Cochin-Bold

Cochin-BoldItalic

Cochin-Italic

Cochin

Copperplate

Copperplate-Light

Copperplate-Bold

Courier

Courier-Oblique

Courier-BoldOblique

Courier-Bold

CourierNewPSMT

CourierNewPS-BoldMT

CourierNewPS-ItalicMT

CourierNewPS-BoldItalicMT

DamascusBold

Damascus

DamascusLight

DamascusMedium

DamascusSemiBold

DevanagariSangamMN

DevanagariSangamMN-Bold

Didot-Bold

Didot-Italic

Didot

DINAlternate-Bold

DINCondensed-Bold

EuphemiaUCAS

EuphemiaUCAS-Bold

EuphemiaUCAS-Italic

Farah

Futura-Medium

Futura-CondensedMedium

Futura-MediumItalic

Futura-CondensedExtraBold

GeezaPro-Bold

GeezaPro

Georgia-BoldItalic

Georgia-Bold

Georgia-Italic

Georgia

GillSans

GillSans-Italic

GillSans-BoldItalic

GillSans-Light

GillSans-LightItalic

GillSans-Bold

GujaratiSangamMN-Bold

GujaratiSangamMN

GurmukhiMN-Bold

GurmukhiMN

华文细黑

华文细黑

华文中宋

华文细黑

Helvetica-Oblique

Helvetica-Light

Helvetica-Bold

Helvetica

Helvetica-BoldOblique

Helvetica-LightOblique

HelveticaNeue-BoldItalic

HelveticaNeue-Light

HelveticaNeue-Italic

HelveticaNeue-UltraLightItalic

HelveticaNeue-CondensedBold

HelveticaNeue-MediumItalic

HelveticaNeue-Thin

HelveticaNeue-Medium

HelveticaNeue-ThinItalic

HelveticaNeue-LightItalic

HelveticaNeue-UltraLight

HelveticaNeue-Bold

HelveticaNeue

HelveticaNeue-CondensedBlack

HiraKakuProN-W6

HiraKakuProN-W3

HiraMinProN-W6

HiraMinProN-W3

HoeflerText-Regular

HoeflerText-BlackItalic

HoeflerText-Italic

HoeflerText-Black

IowanOldStyle-Bold

IowanOldStyle-BoldItalic

IowanOldStyle-Italic

IowanOldStyle-Roman

Kailasa

Kailasa-Bold

KannadaSangamMN

KannadaSangamMN-Bold

KhmerSangamMN

KohinoorDevanagari-Light

KohinoorDevanagari-Book

KohinoorDevanagari-Medium

LaoSangamMN

MalayalamSangamMN

MalayalamSangamMN-Bold

Marion-Regular

Marion-Italic

Marion-Bold

MarkerFelt-Thin

MarkerFelt-Wide

Menlo-BoldItalic

Menlo-Regular

Menlo-Bold

Menlo-Italic

DiwanMishafi

Noteworthy-Bold

Noteworthy-Light

Optima-Regular

Optima-Italic

Optima-Bold

Optima-BoldItalic

Optima-ExtraBlack

OriyaSangamMN

OriyaSangamMN-Bold

Palatino-Roman

Palatino-Italic

Palatino-Bold

Palatino-BoldItalic

Papyrus-Condensed

Papyrus

PartyLetPlain

SavoyeLetPlain

SinhalaSangamMN

SinhalaSangamMN-Bold

SnellRoundhand-Black

SnellRoundhand-Bold

SnellRoundhand

Superclarendon-Regular

Superclarendon-BoldItalic

Superclarendon-Light

Superclarendon-BlackItalic

Superclarendon-Italic

Superclarendon-LightItalic

Superclarendon-Bold

Superclarendon-Black

Symbol

TamilSangamMN

TamilSangamMN-Bold

TeluguSangamMN

TeluguSangamMN-Bold

Thonburi-Bold

Thonburi

Thonburi-Light

TimesNewRomanPS-BoldItalicMT

TimesNewRomanPSMT

TimesNewRomanPS-BoldMT

TimesNewRomanPS-ItalicMT

Trebuchet-BoldItalic

TrebuchetMS

TrebuchetMS-Bold

TrebuchetMS-Italic

Verdana-BoldItalic

Verdana-Italic

Verdana

Verdana-Bold

ZapfDingbatsITC

Zapfino

请参见https://gilesey.wordpress.com/2015/01/14/ios-spritekit-font-loading-times-of-sklabelnodes/


0
我在我的 "AppDelegate.m" 文件中添加了这个方法:
- (void)setupFonts
{
    SKLabelNode *preloadFontLabel = [SKLabelNode labelNodeWithFontNamed:@"cinnamonCake"];
    [preloadFontLabel setText:@"Preload"];
}

并在其中调用:

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

应用程序加载速度没有变慢,并且在整个应用程序中运行得非常流畅。 在这里找到了答案:SKLabelNode延迟应用程序启动


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接