Python で滑らかなアニメーションを描画する方法を探しています。一部はサブピクセル フィルタリングが好きで、一部は API に慣れているため、cairo を使用したいと考えています。私の最初のアプローチは、カイロ サーフェスのターゲットとして GTK.DrawingArea を使用することでした。描画は迅速でしたが、ディスプレイ/バッファリングを垂直同期に結び付ける信頼できる方法を見つけることができなかったため、アニメーションはぎくしゃくして信頼性がありませんでした。
私の次のアプローチは、PyGame を試すことでした。wikiの例を出発点として使用して、さまざまな跳ねるボールをアニメーション化する簡単なコードをいくつか書きました。リンクされたページのさまざまなアプローチは、次の 2 つのカテゴリに分類されます。
- オフスクリーン cairo ImageSurface に描画し、Numpy を使用してピクセル バッファーを Pygame サーフェスに変換します。
- 両方のサーフェスで同じメモリを共有
最初のアプローチは、変換に約 10 ミリ秒かかるため、パフォーマンスが低下します。これは、私が 60 Hz フレーム用に持っているタイム スライスのほとんどです。2.2Ghz Core2Duo と Nvidia 8400 を搭載した Macbook-pro でコードを実行しています。時間はサーフェスのサイズに大きく依存します。これは 800x800 ウィンドウの場合です。
2 番目のアプローチは、ピクセル座標の順序から明らかになります。cairo と pygame はどちらも、RGB ピクセル順序のみを使用でき、変換をサポートしていないと主張しています。問題は、pygame サーフェスをセットアップするときに BGRA ピクセル順序付けが使用されることです。
それでは、質問のために:
- Mac 上のいずれかのライブラリで使用されるピクセル形式を相互に互換性があるように変更することは可能ですか?
- 不可能な場合、純粋に Python で変換を行う最速の方法は何ですか?
- 最速の Python の方法でもフレームのほとんどの時間を無駄にする場合、C コードにインターフェイスして変換を行うにはどうすればよいでしょうか?
- C へのインターフェイスがどれほど複雑かにもよりますが、単に C で SDL インターフェイスを記述する代わりに、pygame を使用することにどの程度の意味があるのでしょうか?
.