【要約】PyxelとNumPyで作る!60FPSで爆速に動く2Dピクセルアート流体シミュレーション [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
Pythonで流体シミュレーションを実装しようとする開発者は、計算負荷の高さという課題に直面する。格子法を用いたナビエ・ストークス方程式の計算を、標準的なforループで記述すると、処理が極めて重くなる。
- ・計算量の増大により、フレームレートが1FPS以下に低下する。
- ・数値拡散により、流体のキレ(渦)が失われる。
- ・リアルタイム動作のために高価なGPUリソースが必要となる。
// Approach
開発者は、計算処理の大部分をNumPyのベクトル演算に置き換えることで、CPUのみでの高速化を図った。
- ・
np.rollを用いた差分計算により、ループを排除しベクトル化を実現。 - ・セミ・ラグランジュ法による移流項の計算。
- ・渦度閉じ込め(Vorticity Confinement)による渦の強調。
- ・ヤコビ反復法を用いたポアソン方程式の解法による非圧縮性の確保。
- ・ドメインワーピングによる質感向上と、動的な256色パレットの生成。
// Result
NumPyによる完全なベクトル化により、128×72の解像度においてCPUのみで60FPSの動作を実現した。
- ・ドメインワーピングにより、低解像度でも繊維質な質感を表現。
- ・動的なカラーパレット生成により、情緒的なビジュアルを実現。
- ・マウスやゲームパッドによるインタラクティブな操作性を確保。
Senior Engineer Insight
> 本実装の肝は、Pythonの弱点であるループ処理をNumPyのベクトル演算で隠蔽した点にある。これは、リソースの限られた環境での高度な演出において、極めて実戦的な手法だ。ただし、解像度向上に伴う計算量の増大には注意が必要である。計算量と視覚効果のトレードオフを、解像度とベクトル化のバランスで制御する設計思想は、リアルタイムシステム開発の基本を突いている。