fiber based job systemを作った

fiber based job systemを作った

repository
GAJobSystem

参考

これは2015年にGCDで発表されたNaughty Dogの並列化に基づいて実装した。
Parallelizing the Naughty Dog Engine Using Fibers

FiberについてはMSDNを参照。
https://docs.microsoft.com/en-us/windows/win32/procthread/fibers

以下は自分なりの解釈。

  • Fiberを切り替えることで実行中スレッドが持つコンテキスト(スタックやレジスタ)を明示的に切り替えることができる。
  • プログラムが明示的にコンテキストを切り替えることで実行中の処理を中断し別の処理を同一スレッド上で開始できる
  • スタックやレジスタ情報自体はFiberが保持しているので、中断したFiberに切り替えることで処理を再開することができる
  • Fiber A -> Fiber B -> Fiber A -> Fiber C...といった動きが可能

上記資料でほとんどのことは解説されているので与太話を書いておく。

与太話

  • 個人的にこの実装の良いところは手続き型プログラミングのように並列処理が書けること、感覚としてはC#のasync/awaitに近いんだろうか。

  • fiber based job systemは基本的に1ループ/1フレームで完結させる処理だけで使えると考えている(ゲームループの更新、描画コマンドの作成、物理処理など)
    仕組みの関係上、時間が必要な処理(ファイル読み込み)や独自処理が多いもの(サウンド再生とか?)などではスレッドを専有してしまうし、そういった処理は専用のマルチスレッドで動かせる仕組みを実装したほうが処理の最適化や分離がしやすいのではないかと思う。

  • GitLab上のリポジトリの作成日が2018/11月だった

    • このGAJobSystemは更に古い実装の再実装とモジュール化を目的としていたので、相当長い間塩漬けにされていたようだ
  • 次はファイル読み込み周りのいい感じの実装を考えたい