2021/02/16(火) [n年前の日記]
#2 [raspberrypi][pygame] Raspberry Pi Zero W + buster で Pygame 2.0.1 を使ってみた
SDL2 を利用するようになったらしい Pygame 2.0.x を使えば、Raspberry Pi Zero W 上でも今までと比べて動作速度が変わったりしないかなと気になったので、Pygame 2.0.1 を試しにインストールして様子を見てみた。
まず、今現在、raspberry Pi OS buster 上で、Python や Pygame は以下のバージョンが入ってるっぽい。
おそらく、Pygame については以下のDebian向けパッケージでインストールされているのかなと。
_Debian -- buster の python-pygame パッケージに関する詳細
_Debian -- buster の python3-pygame パッケージに関する詳細
手元の Raspberry Pi Zero W の状態についてメモ。
まず、今現在、raspberry Pi OS buster 上で、Python や Pygame は以下のバージョンが入ってるっぽい。
- python 2.7 + pygame 1.9.4.post1
- python 3.7.3 + pygame 1.9.4.post1
おそらく、Pygame については以下のDebian向けパッケージでインストールされているのかなと。
_Debian -- buster の python-pygame パッケージに関する詳細
_Debian -- buster の python3-pygame パッケージに関する詳細
手元の Raspberry Pi Zero W の状態についてメモ。
- OS : Raspberry Pi OS buster
- OpenGL がソフトウェア処理で提供されている状態。(GL Driver : Legacy)
- デスクトップの解像度は 1280 x 720。
- GPUのメモリは 64MB を指定。
◎ Pygame 2.0.1をインストール。 :
Pygame 2.0.1 をインストールしてみる。
注意点。
加えて、Pygame 2.0.1 を動かすためには以下も必要になるっぽいのでインストール。
_Debian -- buster の libsdl2-image-dev パッケージに関する詳細
_Debian -- buster の libsdl2-ttf-dev パッケージに関する詳細
pip3 install -U pygame「-U」は「アップグレードせよ」という指定。これで、Pygame 2.0.1 がインストールされた。
注意点。
- sudo をつけて実行していないので、この Pygame 2.0.1 はユーザのホームディレクトリ以下にインストールされ、そのユーザだけが Pygame 2.0.1 を使える状態になる。
- システム側(?)には相変わらず Pygame 1.9.4.post1 が入ってるので、他のユーザ名でログインして Pygame を使うと 1.9.4.post1 が使われる。
- pip2 ではなく pip3 でインストールしているので、python3 利用時しか Pygame 2.0.1 は使えない。python2 を使うと Pygame 1.9.4.post1 が使われる。
加えて、Pygame 2.0.1 を動かすためには以下も必要になるっぽいのでインストール。
sudo apt install libsdl2-image-dev libsdl2-ttf-devlibsdl2-image* は png画像の読み込みで必要になる。また、libsdl2-ttf* はフォントファイルの読み込みで必要になる。
_Debian -- buster の libsdl2-image-dev パッケージに関する詳細
_Debian -- buster の libsdl2-ttf-dev パッケージに関する詳細
◎ Pygame 2.0.1 のアンインストール手順。 :
ちなみに、Pygame 2.0.1 のアンインストールは以下。
pip3 uninstall pygameユーザのホームディレクトリ以下の Pygame 2.0.1 が削除されて、システム側の Pygame 1.9.4.post1 が利用できるようになる。
◎ スクリプトを動かしてみる。 :
とりあえず、先日HDDから発掘して少し修正したスクリプトを使って、どの程度の速度で動くのか確認してみる。
_PygameをWindows10上でインストール
再度メモするけど、処理内容は以下。
実行は以下。
以下は、Python 2.7 + Pygame 1.9.4.post1 (SDL 1.2.15。Driver種別は X11) で動かした際の結果。7-8FPSが出てる。
一応、スマホで液晶ディスプレイを撮影したソレも載せとく。
そして、以下は、Python 3.7.3 + Pygame 2.0.1 (SDL 2.0.9。Driver種別は X11) で動かした際の結果。1FPS出たり出なかったり。Pygame 1.9.x より遅いという、個人的には予想外の結果になってしまった。
コレも一応、スマホで液晶ディスプレイを撮影したソレも載せとく。
フルスクリーン表示も試してみたけど…。
ちなみに、Raspberry Pi OS の /boot/config.txt を弄って、OpenGL を有効化した状態でも試してみたけど、Pygame 1.9.4.post1、Pygame 2.0.1、どちらもかえって数FPSほど遅くなった。もしかすると pygame.OPENGL を指定して動かすと結果は違ってきたのだろうか…。
何にせよ、Pygame を 1.9.x から 2.0.1 にしただけで動作速度が目に見えて改善するのではと期待してしまったけどそういうわけではないっぽいなと…。
動かしているハードウェアによっては効果が期待できないとか、スクリプトの手直しが必要とか、Pygame 2.0.1 の実力を発揮させるには注意点が色々ありそうな気配。
_PygameをWindows10上でインストール
再度メモするけど、処理内容は以下。
- ウインドウサイズ : 640 x 480
- 64 x 64 ドットのスプライトを160枚描画。
- BGを2枚描画。
- oggを常時再生。
実行は以下。
# Python 2.7 + Pygame 1.9.4.post1 で実行。 python2 pygame_fullscreen.py # Python 3.7.3 + Pygame 2.0.1 で実行。 python3 pygame_fullscreen.py
以下は、Python 2.7 + Pygame 1.9.4.post1 (SDL 1.2.15。Driver種別は X11) で動かした際の結果。7-8FPSが出てる。
一応、スマホで液晶ディスプレイを撮影したソレも載せとく。
そして、以下は、Python 3.7.3 + Pygame 2.0.1 (SDL 2.0.9。Driver種別は X11) で動かした際の結果。1FPS出たり出なかったり。Pygame 1.9.x より遅いという、個人的には予想外の結果になってしまった。
コレも一応、スマホで液晶ディスプレイを撮影したソレも載せとく。
フルスクリーン表示も試してみたけど…。
- Pygame 1.9.4.post1 では 7-8FPSが11FPS前後になって速度が改善した。
- Pygame 2.0.1 はフルスクリーン表示ができなかった。一瞬ウインドウ枠がちらついた後、元のウインドウ表示に戻ってしまった。
ちなみに、Raspberry Pi OS の /boot/config.txt を弄って、OpenGL を有効化した状態でも試してみたけど、Pygame 1.9.4.post1、Pygame 2.0.1、どちらもかえって数FPSほど遅くなった。もしかすると pygame.OPENGL を指定して動かすと結果は違ってきたのだろうか…。
何にせよ、Pygame を 1.9.x から 2.0.1 にしただけで動作速度が目に見えて改善するのではと期待してしまったけどそういうわけではないっぽいなと…。
動かしているハードウェアによっては効果が期待できないとか、スクリプトの手直しが必要とか、Pygame 2.0.1 の実力を発揮させるには注意点が色々ありそうな気配。
◎ 描画速度が遅くてもゲームは作れますよ。 :
一応念のために書いておくけど…。自分はファミコン時代の60FPSで動く2Dゲームに思い入れがあるから、60FPSで動かないと厳しいなとついついうっかり思ってしまうのだけど。しかし、ゲームを作る上で60FPSは絶対に必須というわけでもなくて。
速度が遅いなら遅いなりに、それでも楽しく遊べるゲームを考える方向でアイデアを出せばいいだけ、だよなと…。
- オセロだのパズルだの、あるいは紙芝居ゲーム等々、フレームレートが低くても何の問題もないゲームジャンルは山のようにあるし。
- アクションゲームの類でも、例えば固定画面で数キャラ程度が動く仕様なら、書き換えが必要なところだけ消去と再描画をする方法でフレームレートは高くできるし。
- 10FPS前後でもアクションゲームは作れるし。実際、ガラケー時代は10FPS前後でアクションゲームを作ってたし。
速度が遅いなら遅いなりに、それでも楽しく遊べるゲームを考える方向でアイデアを出せばいいだけ、だよなと…。
◎ Zero系はホントはもっとできる子。 :
これまた一応念のために書いておくけど。フツーのPC群と比べてしまうとさすがにアレだけど、それでも、Raspberry Pi Zero W のGPU(VideoCore IV (VC4))って本当はもっとできる子で…。同梱(/opt/vc/src/hello_pi/) のプログラム群をビルドしてみれば、全画面表示でもヌルヌル動いちゃったりするし。
*1
_Raspberry Pi のサンプル | Raspberry Pi
_デモプログラム − Raspberry Pi公式ドキュメントを日本語訳
あるいは、単に OpenGL を有効にするだけでも、 _glxgears が60FPSで動いちゃうし。 *2
Python + Pygame でサクッと書いてヌルヌル動いたら楽だなー、てな安易な期待を持ちながら動かしてしまったからアレな結果でソレだけど、大昔のゲーム機のようにハードをしゃぶりつくすぜ、チップを叩きまくるぜ、俺の技術力を見せつけてやるぜ、てなノリで弄っていけば結構なことができるスペックを Zero系も持ってるはずなので…。 *3
_Raspberry Pi のサンプル | Raspberry Pi
_デモプログラム − Raspberry Pi公式ドキュメントを日本語訳
あるいは、単に OpenGL を有効にするだけでも、 _glxgears が60FPSで動いちゃうし。 *2
Python + Pygame でサクッと書いてヌルヌル動いたら楽だなー、てな安易な期待を持ちながら動かしてしまったからアレな結果でソレだけど、大昔のゲーム機のようにハードをしゃぶりつくすぜ、チップを叩きまくるぜ、俺の技術力を見せつけてやるぜ、てなノリで弄っていけば結構なことができるスペックを Zero系も持ってるはずなので…。 *3
◎ 余談。Zero系で動画キャプチャは難しい。 :
前述の、スマホで撮影した動画を見て、「なんでもっと奇麗な状態でキャプチャしないんだよ」「Zero本体でキャプチャすればいいじゃん」と思う人が居るかもしれんので念のために書いておくけれど。Zero系で、自身のデスクトップ画面の動画キャプチャは厳しいのですよ。
何せ、ちょっと処理を走らせただけでCPU負荷がすぐ100%になるのに、そこに加えて動画キャプチャ処理も Zero本体にさせたら、そりゃもう結果は火を見るより明らかで。
更に、GPU の VC4 の出力結果は X11 の画面とは別レイヤーに表示される(らしい)ので、もし GPU の本気を見せるプログラムを動かした場合、X11の画面をキャプチャすることを前提にして作られてる動画キャプチャソフトでは VC4 の出力結果をキャプチャできない可能性もあって。
_raspi2png を使って Raspberry Pi のスクリーンショットを撮影する - Qiita
そんなわけで、フツーのPCっぽくデスクトップの動画キャプチャをするのは厳しくて、液晶ディスプレイの画面を別のカメラで撮影するぐらいしか手がないよなと…。HDMIキャプチャユニットでもあれば話は違ってくるのかもしれんけど。 *4
ちなみに、静止画だけならPrintScreenキーを叩くだけで、scrot というキャプチャプログラムが呼ばれて、ユーザのホームディレクトリにスクリーンショットが保存される模様。
何せ、ちょっと処理を走らせただけでCPU負荷がすぐ100%になるのに、そこに加えて動画キャプチャ処理も Zero本体にさせたら、そりゃもう結果は火を見るより明らかで。
更に、GPU の VC4 の出力結果は X11 の画面とは別レイヤーに表示される(らしい)ので、もし GPU の本気を見せるプログラムを動かした場合、X11の画面をキャプチャすることを前提にして作られてる動画キャプチャソフトでは VC4 の出力結果をキャプチャできない可能性もあって。
_raspi2png を使って Raspberry Pi のスクリーンショットを撮影する - Qiita
そんなわけで、フツーのPCっぽくデスクトップの動画キャプチャをするのは厳しくて、液晶ディスプレイの画面を別のカメラで撮影するぐらいしか手がないよなと…。HDMIキャプチャユニットでもあれば話は違ってくるのかもしれんけど。 *4
ちなみに、静止画だけならPrintScreenキーを叩くだけで、scrot というキャプチャプログラムが呼ばれて、ユーザのホームディレクトリにスクリーンショットが保存される模様。
*1: Raspberry Pi Zero W + Raspberry Pi OS buster にも /opt/vc/src/hello_pi/ が入ってたし、試したらビルドもできたし、動かしたらヌルヌル動いた。ただ、Video関係のデモを動かすにはGPUのメモリが足りてないっぽい。デフォルト設定を変えればなんとかなるのだろうか。
*2: いやまあ、「glxgears はベンチマークじゃねえぞ!」と再三言われてはいるけれど…。
*3: もっとも、本来 Zero系は、Lチカしたり、モータを制御したり、そういう用途を念頭に置いているのだろうし…。フツーのPCっぽく使いたいなら Pi3 や Pi4 を選ぶべきだろうし…。「Zero系に過度な期待をするほうがおかしい」と言われたとしても「その通りですね」と返すしかなさそうな。
*4: 今時は1,000円ぐらいのHDMIキャプチャユニットもあるらしいので、ちょっと気になっていたりもして。ただ、自分の場合、利用できたら嬉しい場面がほとんど無いので、購入するところまでは…。
*2: いやまあ、「glxgears はベンチマークじゃねえぞ!」と再三言われてはいるけれど…。
*3: もっとも、本来 Zero系は、Lチカしたり、モータを制御したり、そういう用途を念頭に置いているのだろうし…。フツーのPCっぽく使いたいなら Pi3 や Pi4 を選ぶべきだろうし…。「Zero系に過度な期待をするほうがおかしい」と言われたとしても「その通りですね」と返すしかなさそうな。
*4: 今時は1,000円ぐらいのHDMIキャプチャユニットもあるらしいので、ちょっと気になっていたりもして。ただ、自分の場合、利用できたら嬉しい場面がほとんど無いので、購入するところまでは…。
[ ツッコむ ]
以上です。