2013-11-02 4 views
5

Wenn ich einen Sound mit [self playSoundFileNamed] spiele, gibt es eine kleine Verzögerung beim erstmaligen Abspielen eines Sounds, bei dem die gesamte App für etwa eine halbe Sekunde einfriert, aber danach ist es in Ordnung. Wie kann ich das loswerden?Kleine Verzögerung beim ersten Mal mit SpriteKit

Antwort

15

In meiner Spiel-Setup-Methode, mache ich so etwas und es scheint gut zu funktionieren.

haben eine iVar

SKAction *_ballsHitSound; 

Set it up, wenn die Last der Szene

_ballsHitSound = [SKAction playSoundFileNamed:@"ballsCollide.mp3" waitForCompletion:NO]; 

dann ist der Sound bereit

[self runAction:_ballsHitSound]; 
+1

Die Pause ist das anfängliche Laden des Sounds. Im Prinzip ist das Laden aller Audiodateien im Setup für das Spiel wie das Vorladen und definitiv der richtige Weg. Diese Pause wird während des Setups bestehen, aber die Pause ist während des Setups möglich. – prototypical

+0

Sie werden wahrscheinlich die gleiche Pause beim Laden einer Schriftart für ein SKLabel erleben. Am besten laden Sie SKLabels während des Setups auch mit Fonts, die Sie während des Spiels verwenden. Zum Beispiel, wenn Sie eine bestimmte Schriftart für Score-Popups haben, die nur während des Spiels verwendet werden. – prototypical

0

Die playSoundFileNamed zu gehen: Aktion gemacht zu spielen kleine Sounds, wie Sound-Effekte Ihres Spiels, keine Hintergrundmusik oder solche größeren Sound-Dateien. Wenn Sie größere Audiodateien abspielen möchten, verwenden Sie besser die AVAudioPlayer-Klasse, die Ihnen mehr Kontrolle über die Klangwiedergabe gibt. Hier ist ein Code-Snippet, wie es zu benutzen:

// Load and start background music 
    NSError *error; 
    NSURL * backgroundMusicURL = [[NSBundle mainBundle] URLForResource:@"background-music" withExtension:@"mp3"]; 
    self.backgroundMusicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:backgroundMusicURL error:&error]; 
    self.backgroundMusicPlayer.numberOfLoops = -1; 
    [self.backgroundMusicPlayer prepareToPlay]; 
    [self.backgroundMusicPlayer play]; 
0

Ich denke, dass Sie Ihre Sounds auf dem Haupt-Thread nicht spielen müssen, so würde ich versuchen, es auf dem Hintergrund-Thread zu spielen.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) { 
     // Play it here 
    });