関数をリスト構造にして実現するタスクシステムではなく、 CPU のレジスタを操作してマルチスレッドのごとく動くタスクシステムの実装を見ました。いやぁ、面白い、というかすごいです。
たとえば、「キャラクターを1フレームに1ドットずつ 100 ドットだけ右へ動かす」という場合、次のように書いてしまう失敗が多くあります。
for (int i = 0; i <100; i++) { // ループの中で書いて良いの? // ここ、1フレーム中に 100 回呼ばれるよ? theChar->moveToRight(); }
これはたいていの場合失敗です。これを実行すると1フレームで 100 ドット右に動いてしまいます。メルマガの読者の方はすでにご存じですよね。しかし、マルチスレッド系はこれで大丈夫です。実際は同期を取るため何らかの関数を挟む必要がありますが、かなり頭で考えているイメージとソースコードが近くなりますよね。
// このループを抜ける頃には 100 フレームくらいかかってるんじゃないかな? for (int i = 0; i <100; i++) { theChar->moveToRight(); wait(); // ←ほかのタスクと同期(こいつだけ早く終わるのを避ける) }
しかしながら、これを書いた人は「これを使うにはそれなりの知識が必要になると思う」とのこと。確かに生まれながらにしてシングルスレッド脳の私には扱えません。
Comments
それはコルーチンっすよ
自分も最近知って使いまくってます
ファイバーとかマイクロスレッドとも言うらしい
> soramame さん
おお、これが噂のコルーチンですか!
名前しか知りませんでした…
あと、ファイバーとかマイクロスレッドというのは初めて聞きます。
ゲームに応用できそうですね。
Contributions