2023/6/27(火)

Vulkan Guideに載っている「Multithreading for game engines」の項を読んだ。このシリーズはVulkanの解説だが、ゲーム一般のマルチスレッド化の方法としてとても参考になった。

https://vkguide.dev/docs/extra-chapter/multithreading/

ベーシックな方法としてはゲームロジックのスレッドと描画スレッドに分ける。そしてフレームごとに同期する。これだと2スレッドにしかならないので、それ以上をどうするかというと、まず描画データとゲームデータに分割し、描画処理では描画データ以外には一切触らない。そして次にゲームロジックの計算を細かいタスクに分けて複数のワーカーで分担する。そして何のタスクも行われていないタイミングを見計らってゲームデータを描画データに同期する。

描画スレッドのマルチスレッド化は結構面倒なようだ。OpenGLのようなレガシーなAPIだと本当にシングルスレッドでしかやりようがないらしい。Vulkanの場合は(ややこしくはあるが)やりようがある。複数のコマンドバッファを並列で書き込んでセカンダリバッファとして扱うとか、パイプライン構築時にシェーダモジュール構築を別スレッドでやるとか、まあやれるもののようだ。ただし同じキューには同じスレッドからしかsubmitできないみたいな制限があったりしてそこには気を付ける必要がある。


「ULSI設計」を読んだ。アナログ回路の項に目を通したら割と色々なものが見えるようになってきた。特にレベルシフタ、能動負荷あたりがとても参考になった。レベルシフタというとダイオードで電圧を下げるか、2重NOTで頑張るくらいしか頭になかったのだが、トランジスタ一個と抵抗2個を使ったかしこい回路が載っててかなり参考になった。能動負荷も、理屈としては知っていたが、能動負荷という名前は初めて認識した。

あと回路トポロジの話ではないが、「集積回路では部品の比精度は結構高い」という話がとても参考になった。絶対サイズの精度はそうでもないが、比率の精度は高いので、例えば分圧・分流の類の回路で活かせるらしい。こういう一般性の高い知見は本当にたすかる。


ジョギングした。4.2km。

久々にタイムを計った。20.5minほどだった。このままじゃ前回より遅くなるぞ~と思って終盤頑張ったら前回より30s~1minほど短縮できた。

最後追い込んだら呼吸が苦しくなったので、肩を大げさに上げたらずいぶん楽になった。どうやら体が腹式呼吸になっていたらしい。まさか肺呼吸の訓練が必要?


今週の胎界主を読んだ。北斗確保されてる!?こんな縛っても口から出るあれでどうとでも出来そうだけど、なんか企んでるのか。

Categories: