SpriteKitで効果音を再生する際、
[obj-c]
[self runAction:[SKAction playSoundFileNamed:@"test.mp3" waitForCompletion:NO]];
[/obj-c]
と記述していたが、何度も繰り返し再生する場合や、複数のファイルを連続して再生する場合、ロードされない現象が起こる。これは必ず起こるわけではなく、ある程度、走らせていると発生するので原因特定に非常に時間がかかった。stackoverflowでも報告されており、
初期化時(シーン初期化)にプレロードしておくことで解決するとのこと。
実は、パーティクル生成、テクスチャーの読み込みでも似た様な現象が起こり、
[obj-c]
SKEmitterNode* emitter = [NSKeyedUnarchiver unarchiveObjectWithFile:
[[NSBundle mainBundle] pathForResource:@"particle"
ofType:@"sks"]];
[/obj-c]
上記のコードで、(相当に)繰り返し生成すると、突然emitterにnullが入り、クラッシュする現象である。これもあらかじめ、init時にプレロードして、[emmiter copy]で使い回しす。安全のためテクスチャーもプレロードしてcopyして使うようにした。これでクラッシュは収まった気がする。
どうやら、リソースの読み込みは、その都度ではなくinit時にプレロードして、コピーが必要なものはコピーして、使いまわすと良い様だ。2日かかった・・・。なきそう