BlogKLabは、多くのスマートフォン向けゲームを開発・提供しています。スマートフォン向けゲームの開発と運用は、Webソーシャルゲームと比べて格段に複雑で、またコンシューマゲーム開発とも異なったノウハウが求められる領域もあります。このブログでは、KLabのゲーム開発・運用の中で培われた様々な技術や挑戦とそのノウハウについて、広く紹介していきます。〜流体シミュレーションのコードを探るpart2〜※この記事ではgitのタグ「v2.74」から生成したブランチ上でコードリーディングしています。前回は流体シミュレーションの実験のためのプロジェクトを作成しました。)今回はこれをもとに流体シミュレーションのコードリーディングをしていきます。流体シミュレーションの計算が行われるのはDomainタイプのFluidオブジェクトのBakeボタンを押したときです。このときに何が起きるのか探っていきましょう。流体計算の関数を探すまずはBakeボタンを押したときに呼ばれる関数を探したいと思います。やって探すか?UIパーツにマウスカーソルを合わせると、そのUIに関するPythonの命令を表示してくれます。いうPythonの命令が出てきます。ここで余談になるのですが、Blenderはコマンドラインからバックグラウンドで立ち上げる事も出来ます。Proなどハイスペックなマシンをサーバーとして用意しておき、流体シミュレーションのBakeなど長く時間のかかるものはサーバーで起動したBlender上でPythonコマンドを使って自動で処理させておくような事も可能です。話を元に戻してbpy.ops.fluid.bake()を起点にC<ー>Pythonのつなぎの部分のコードを追いかけていくと確実にたどり着けそうですが・・・まあ、もっとシンプルに「fluid」や「bake」で検索すればおそらくたどり着けるでしょう。files案の定、physics_fluid.cといういかにも関係ありそうな名前のファイルが引っかかります。このphysics_fluid.cのなかで「fluid(Any)bake」は27カ所。fluid_bake_invoke()もfluid_bake_exec()も両方中でfluidsimBake()を呼んでいるので、fluidsimBake()の先頭部分にブレイクポイントを張ってBakeボタンを押してみる事にします。すると狙い通りブレイクポイントに引っかかりました!fluidsimBake()の中身を追うfluidsimBake()の中身は232行に渡っています。その中の多くはパラメータをセットする命令になっているようです。最後の方にジョブをスタートさせたりコールバックの設定をしたりするような部分があります。別スレッドで非同期に動かすためのジョブのパラメータをセットし、最後にジョブをスタートさせる事で流体シミュレーションを実行させているのではないでしょうか?Bakeが終わるのを待っている間他の操作が同時に出来るので、そう考えると自然な気がします。ジョブを追うこのような予測のもと、ジョブを中心に追いかけていこうと思います。実際の流体計算にたどり着き、それが別スレッドで実行されていれば予測が的中しているものと見てよさそうです。fluidsimBake()の最後の方で呼ばれているfluidbake_startjob()がジョブをスタートさせる関数で、これに渡されているジョブがfbと言う名前の付いたFluidBakeJob構造体のポインタです。*settings;にいろいろ詰まってそうです。fsset;というように、fssetというポインタが渡されています。runsimCallback;という関数ポインタ(別の場所でelbeemRunSimulationCallbackはtypedefされている)が定義されています。コールバックなのでもし流体計算が別スレッドで処理されていればそのスレッドから呼ばれるので、ブレイクポイントで止めれば計算箇所を突き止められるかもしれません。frame)がセットされています。この関数の先頭にブレイクポイントを仕掛けてみましょう。すると予想通り別スレッドから呼ばれている事がわかりました。ブレイクポイントに引っかかっているので、どの関数からコールバックが呼ばれているのかもわかります。「elbeem」ってなんだ??どうもさっきからelbeemSimulationSettingsやelbeemRunSimulationCallbackの「elbeem」という名前が目につきます。ブレイクポイントを張って調べたrunSimulationCallback()もbf_intern_elbeemフォルダの中のソースから呼ばれています。この「elbeem」って何なんでしょう?Googleで調べてみるとhttp://elbeem.sourceforge.netにたどり着きます。library.」Blenderは流体シミュレーションのためにこのライブラリを採用していたのですね!格子ボルツマン法に基づいたライブラリだそうです。