GCDを使ってコードブロックをバックグラウンドで定期的に実行するにはどうしたらいいですか? 私はレンダリング、物理学、ゲームロジックなどのいくつかのサブシステムを持つゲームエンジンを作成しようとしています。いくつかのタスクはイベントドリブンでなければなりませんが、物理システムのような一部のタスクはバックグラウンドで一定の時間(たとえば1/100秒後)で呼び出す必要があります。 コードのブロックを作成しましたが、このブロックをバックグラウンドで定期的に実行するにはどうすればよいですか? GCDの正しいツールはここにありますか?GCDを使ってバックグラウンドでコードブロックを定期的に実行できますか?
12
A
答えて
10
GCDディスパッチソースが必要です。サンプルコードについては、Creating a Timer Exampleを参照してください。スウィフトは
6
コメントに@mattが書いているように、このためにタイマーディスパッチソースを使用することができます。そこへの正しいアプローチについての彼の答えを見てください。後世のために
は、ここでいくつかの選択肢を持つ私のオリジナルの答えです:あなたのレンダリングコールバックで
(たとえば、CADisplayLinkを使用して)、このための物理計算GCDジョブオフ火災(または次の?)フレーム。レンダリングフレームごとに複数の更新を行う必要がある場合は、そのジョブループを数回行うだけです。
次に計算が必要になるまでスリープする物理スレッドを持っています。このために別のスレッドがある場合、NSTimerはスレッドを100Hzで起動させるのに十分な解像度を持つかもしれません。 (メインスレッドでは、runloop上の他の入力ソースが速く一貫して発火するのを防ぐため、これは機能しません)。NSTimerが機能しない場合は、必要な次の物理アップデートまでの時間を計算し、あなたのスレッドを眠らせてください(例:
[NSThread sleepForTimeInterval:]
)dispatch_after
を使用するブロックがあります。このような
何か:
dispatch_time_t next = dispatch_time(DISPATCH_TIME_NOW, 0);
block = ^{
next = dispatch_time(next, 10000000L); // increment by 10 ms
// do physics here
dispatch_after(next, queue, block);
}
あなたは(すなわち、それをdispatch_after呼び出す前に、あなたの次の時間が過去にあるかどうかを検出など)、コマ落ちについて少し賢くする必要があります
3
あなたはGCDを使ってタイマーを作成することができます
func CreateTimerDispatchSource(interval: UInt64, leeway: UInt64, queue: dispatch_queue_t, block: dispatch_block_t) -> dispatch_source_t {
let timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue)
dispatch_source_set_timer(timer, dispatch_walltime(nil, 0), interval, leeway)
dispatch_source_set_event_handler(timer, block)
return timer;
}
var timer = CreateTimerDispatchSource(5*NSEC_PER_SEC, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
// do some serious stuff
}
スタートまたはタイマーを再開:
dispatch_resume(timer)
タイマーサスペンド:
dispatch_suspend(timer)
関連する問題
- 1. 定期的にバックグラウンドでサービスを実行する
- 2. PythonでFlaskを使って定期的にタスクを実行する方法
- 3. Scilabで定期的にタスクを実行
- 4. Mathematica - 1つの変数を使ってコードブロックを定義できますか?
- 5. Pythonで関数を定期的に実行しています
- 6. VB.NETで任意のコードブロックを実行できますか?
- 7. asyncioを使ってバックグラウンドでスレッドクラスの関数を実行する
- 8. 次の実行ループで実行:GCDで何が問題になっていますか?
- 9. AWS Athenaクエリを定期的(スケジュール上)で実行できますか?
- 10. デバイスがアイドル状態であっても、定期的にタスクを実行する*
- 11. バックグラウンドサービスを特定の時刻に定期的に実行します。ジョブスケジューラを使用して定期的に実行します。
- 12. 「ロケーションアップデート」プロセスはどれくらいの期間バックグラウンドで実行できますか?
- 13. asyncioを使ってdjangoの定期的なタスクを実行する
- 14. 手作業で定期的にメソッドを実行します。
- 15. 定期的に非同期タスクを自動的に実行するために、Node.jsで別のスレッドと同等のスレッドを実行できますか?
- 16. Python:メインスレッドを継続的に実行中、バックグラウンドで実行中
- 17. スクリプトをバックグラウンドで実行しますか?
- 18. スウィフトスクリプトを定期的に実行する
- 19. 定期的にアプリケーションを実行する
- 20. グローバルタイマーをバックグラウンドで実行することはできますか?
- 21. GCD非同期、シリアルキュー - キューサイズを制限できますか?
- 22. サービス労働者をバックグラウンドで継続的に実行していますか?
- 23. nohupでコマンドを実行すると、nohupでコマンドを実行するとバックグラウンドで実行されるため、バックグラウンドでnohupを使用して実行します。
- 24. モバイルWebアプリケーションをバックグラウンドで実行できますか? (iOSとAndroid)
- 25. Office Appをバックグラウンドで実行できますか?
- 26. 毎時バックグラウンドでPHPスクリプトを実行できますか?
- 27. xlwingsはバックグラウンドでExcelを実行できますか?
- 28. アンドロイドとiOS APPをバックグラウンドで実行できますか?
- 29. JavaScriptを使ってバックグラウンドでファイルを動的にアップロードする
- 30. AppleScriptを強制的に同期して実行できますか?
こんにちは、返信に感謝を。私の主な目標は、物理サブシステムをレンダリングから切り離すことです。だから、二番目の答えは私の方が適していると思いますが、ブロックとGCDのソリューションがあるかどうかは疑問です。 – asdf
OK。私は3番目のオプションを追加しました。 –
"タイマーディスパッチソースは、定期的な時間間隔でイベントを生成します。タイマーを使用して、定期的に実行する必要がある特定のタスクを開始できます。 "それがGCDで定期的な仕事を直接サポートしているのではなく、ちょうどその文脈の中でOPは何を求めているのですか? – matt