現象
ios8.3 SpriteKitで、音を再生すると、画像のコマ飛びが発生する場合があって、怪しいなと思いつつ放っておいたのですが、IOS9で、画像のコマ飛びがビシッと安定して発生するので、深追いする事にしました。
発生条件
1.音源の再生は、AVAudioPlayerです。
2.update()内で音源の再生する。
3.音源の再生が終了後に数秒待ってから音を再生する。
確認プログラム
iOS Apprication>Game
Game Technology:SpriteKit
update()内で周期的に音源を再生することで周期に対するplay処理時間計測
・INTERVAL(周期) を変更しTESTする
・sound.aiff:0.00325sの音源を使用
#import <AVFoundation/AVFoundation.h>
#import "GameScene.h"
#define INTERVAL 4
@implementation GameScene
AVAudioPlayer *audio;
-(void)didMoveToView:(SKView *)view {
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"sound" ofType:@"aiff"] ];
audio =[[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
audio.numberOfLoops = 0;
[audio prepareToPlay];
// 最初の音
[audio play];
sndTime=[NSDate date];
}
NSDate *sndTime;
-(void)update:(CFTimeInterval)currentTime
{
if( (-[sndTime timeIntervalSinceNow])>INTERVAL)
{
NSDate *measure=[NSDate date];
[audio play];
sndTime=[NSDate date];
NSLog(@"Measure=%f",-[measure timeIntervalSinceNow]);
}
}
@end
テストターゲット
同じ機種でIOSが異なる物件がなくてこうなりました。
iPod touch 6th( A8 ios9.1 ): 注)Xcode7
iphone 5s( A7 ios8.3 ) : 注)Xcode7
ipad mini2( A7 ios7.1 ) : 注)Xcode7
iPod touch 6th(A8 ios10.0) : 注)Xcode8
iPod touch 6th(A8 ios11.0) : 注)Xcode9
結果( LoggingのMeasure結果を10回平均した )
横軸(インターバル秒) 縦軸Play時間(s)
テストターゲットが異なるからこの結果がiosに依存していると断言はできませんが
このような現象が発生する可能性が高いと考えます。
ios10,ios11でも同じ結果が観測されました。io9以降で明らかに遅くなっていると推定します。
- playが3〜4msで遅い事( playしなければMeasureが余裕で0.0001s以下だった)
- ios9.1/ios10.0では、再生周期が2秒以上で 100ms Overになる事(びっくりした)
ios7基準ではios9は遅い事(多分ios8も遅いと思います)ios7/ios8の場合間隔(INTERVAL)が広くなると時間がかかるように感じる。
結論
1.ios8.3でコマ飛びが発生するのは、そもそも playの負荷で発生していた。
2.ios9.1/ios10.0でコマ飛びが発生するのは、結果1.に加え結果2.の影響で発生していた。
対策
結論2. 対策
update()内に [audio prepareToPlay]; を追加しても改善効果がありませんでした。
容赦ないです。現状、2秒以内になにかをplayすれば、効果があるようです。
無音を再生して対応することにしました。(気に入らないですが・・・・)
最終的には、バックグラウンド再生することになりました。
結論1.対策
根本的な対策(マルチスレッド/CoreAudio等)が必要に思えます(対策が簡単でないし、内容が重すぎる・・・・無理・・・・・(^^; )
しかし、無音再生して対応したら、明らかに改善した。
=>不思議だぁ まだ、知らないなにかがいそうです。
考察
ios9以降 消費電力関連でどうも一定時の間に音源再生されなければ停止処理が実行されているように思えます。
ios11 グラフではわからないのですが、ios10にくらべて一回一回のばらつきが大きくなっている。(100ms遅い場合もある。)
まだ、たまに一瞬カクカク動作があるので調べる必要がありそうです。