6

目前我正在用 SpriteKit 编写一个小应用程序,它工作得很好,但唯一的问题是一个 SKLabelNode,我用以下正常的代码初始化它:

​self.scoreLabel = [SKLabelNode labelNodeWithFontNamed:@"Futura"];
self.scoreLabel.fontSize = 190.0f;
self.scoreLabel.color = [SKColor whiteColor];
self.scoreLabel.alpha = .2;
self.scoreLabel.text = @"00";
self.scoreLabel.position = CGPointMake(screenWidth/2,self.scoreLabel.frame.size.height/2);
[self addChild:self.scoreLabel];

还有更多的东西要初始化,但它们不会影响任何东西。如果我注释掉上面的代码,应用程序会在正常时间加载。使用 SKLabelNode 它将加载延迟几秒钟......

希望任何人都可以帮助我。

4

3 回答 3

9

实际上,您不需要为 SKLabelNode 预加载字体。延迟的原因是您使用了错误的字体名称。iOS 上没有“Futura”字体——你的意思可能是“Futura-Medium”。将“Futura”替换为“Futura-Medium”,您应该会看到加载时间急剧下降。

(您仍然可以预加载字体,但这不是必需的;如果您使用正确的字体名称,延迟加载非常快。)

于 2014-05-14T13:42:47.970 回答
5

小心你没有加载整个字体系列。如果我加载“Chalkboard SE”,它将需要 4-6 秒,并且似乎可以工作。

但如果我加载 ChalkboardSE-Regular ,它几乎是瞬时的 ~100 毫秒或更短。

如果您想了解更多信息,我在我不起眼的博客上有各种链接和时间安排。https://gilesey.wordpress.com/2015/01/14/ios-spritekit-font-loading-times-of-sklabelnodes/

于 2015-01-14T20:59:01.880 回答
2

您需要预加载字体,以便在您第一次调用 SKScene sprite 套件时已经在内存中准备好字体。最好的方法是在游戏生命周期中尽快使用应用程序委托或单例。

self.scoreLabel = [SKLabelNode labelNodeWithFontNamed:@"Futura"];
self.scoreLabel.text = @"preload";

您不需要将标签设为全局,只需确保保留强引用以让编译器知道您希望它将字体保留在内存中。还要确保设置了 text 属性(仅在设置时才加载字体)。

编辑:

这就是我正在使用的:

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

这是在游戏开始时从游戏资产单例中调用的,我还有一个回调,在资产加载之前停止出现“播放”按钮,因此用户在一切就绪并加载之前无法开枪。我的游戏资源只需要 1.03 秒即可加载,所以这不是问题,但如果需要,您也可以在启动画面/启动屏幕后面隐藏更长的负载。

如果您仍然看到问题,我会检查您没有预加载的任何其他字体。加载自定义SKScene字体也可能是一个问题,尝试将字体更改为“HelveticaNeue-UltraLight”,看看是否遇到同样的问题。

于 2014-04-23T21:54:08.293 回答