NSTimerで推奨される時間間隔について
前回、アニメーション中に衝突検知をするために
NSTimerを用いていると書きましたが、
今回は少し詳しく書こうと思います。
タイトルは正確には
「NSTimerで非推奨となってしまう時間間隔について」
ですね。。
まず、教科書通りのNSTimerの呼び出し方を書きます。
NSTimer *tm = [NSTimer scheduledTimerWithTimeInterval:0.3f target:self selector:@selector(doNext:) userInfo:nil repeats:YES ];
これによって
doNextメソッドが0.3秒間隔で永遠に呼び出されるわけです。
前回の記事でアニメーション中の衝突検知を
このNSTimerで行っていると書きましたが、
実際には敵機とビームの進行速度と衝突検知の時間間隔次第では
ビームが敵機をすり抜ける可能性もあるので、
この数字がどこまで短くできるのか気になります。
少し調べてみました。。
日本語の解説ページがあまりなかったのですが、
こちらのハウツーサイト(英語)では以下のように書かれています。
なぜこの質問を選んだのか突っ込まれるかもしれませんが、
「nstimer second interval」で検索して最上位だった記事です。
<質問>
ナノ(0.000000001)秒間隔で処理を実行する方法について
<解答>
NSTimerはナノ秒間隔で処理を実行することはできなくて、恐らく(それを無理矢理やったとしても)期待される結果を得ることはできない。
最も短い実行間隔は0.1ミリ秒で、それよりも短い間隔を指定すると0.1ミリ秒に設定される。
(その後はOSの実行間隔より短くなることは出来ないとか、システムビジー状態ではそれより遅くなる的なことが書いてある)
0.1ミリ秒ってめちゃくちゃ速い気がしますが、
この解答には11って数字が着いていて
たぶん11人が参考になったってことだと思います。
なのでこの数字も全く見当違いってことでもなさそうです。
あとはコチラ(英語)が参考になりました。
この中では、NSTimerは極めて限定的な機能しか持たず、
プログラムの実行状況にもよるが最低0.05秒から0.1秒間隔が推奨されている、とありますね。
(※それにしても回答者の歪んだgif画像の人はいろんなところに出てきますね。すごいです)
結論として0.05秒間隔より短いタームで実行すると良くないことが起こりそうですね。
それより短い間隔で何か処理を実行する場合は別の方法を考えなければならないようです。