2017/04/21(金) [n年前の日記]
#3 [python] pysdl2をほんの少しだけ試用
Python関係のページをググって眺めてるうちに pysdl2 の単語が目に入って。
アレって今時はどうなってるんだろうと気になり始めたので、せめて導入だけでも試してみようかと。いや、以前も一度試したんですが、面倒臭かった記憶しか…。少しは変わってるのかな…。
ちなみに動作環境は Windows10 x64 + Python 2.7.13。
アレって今時はどうなってるんだろうと気になり始めたので、せめて導入だけでも試してみようかと。いや、以前も一度試したんですが、面倒臭かった記憶しか…。少しは変わってるのかな…。
ちなみに動作環境は Windows10 x64 + Python 2.7.13。
◎ pysdl2についてざっくり説明。 :
pysdl2 ってのは…。Python で2Dゲームを作れる pygame というライブラリの後継になりそうだったけど今一つなれてないビミョーな扱いを受けてるライブラリで。
昔は「Pythonで2Dゲーム作るならpygame」てな空気があったのだけど。pygame は SDL を使っていて、その SDL は標準状態だとソフトウェアレンダリングだから描画が遅くて。 *1 何せ、全画面書き換えをすると30FPSすら出ないから _「書き換えが必要なところだけ覚えておいてそこだけ書き換えれば速くなるんだぜ! Dirty rectって言うんだぜ!」 てな感じのソレってPC-8801だのFM-7だのWindows3.1時代の話ですかと首を傾げるようなノウハウが公式サイトで語られ続けるほどに今となってはトホホなレベルのライブラリで。
後継ライブラリとして一時期は _pygame2てのが作られていたらしい のだけど。実装しなきゃいけない部分が多岐にわたって作者さんが途中で力尽きて、もうこういう pygame っぽい機能豊富でゴージャスなライブラリは作ってられませんわ開発停止しますわー、となったようで。
その代わり、SDL2の薄いラッパーを目指すぜ、シンプルにするぜ、最低限のことしかしないぜ、やりたいことがあったら自分で頑張って実装してくれよな、と方針が変わって pysdl2 が出てきたのだけど。
薄いラッパーだから、pygame と比べるとユーザ側でやることが増えて使い勝手が悪くなった上に、例えば Windows上で動かす際にはSDL2関係のDLLが必要なのだけど一部のバイナリが配布されてなくて「使いたい人はDLLを自分でビルドしてね」と平然と言われる始末。pygame に比べたら導入すら面倒臭いので、ほとんど誰もあえてわざわざコレを使おうとはしないし誰も使わないからユーザレベルのドキュメントもさっぱり増えないという状況に…。
てな感じの説明で合ってるんですかね? もし間違ってたら誰かツッコミ入れといてください。
昔は「Pythonで2Dゲーム作るならpygame」てな空気があったのだけど。pygame は SDL を使っていて、その SDL は標準状態だとソフトウェアレンダリングだから描画が遅くて。 *1 何せ、全画面書き換えをすると30FPSすら出ないから _「書き換えが必要なところだけ覚えておいてそこだけ書き換えれば速くなるんだぜ! Dirty rectって言うんだぜ!」 てな感じのソレってPC-8801だのFM-7だのWindows3.1時代の話ですかと首を傾げるようなノウハウが公式サイトで語られ続けるほどに今となってはトホホなレベルのライブラリで。
後継ライブラリとして一時期は _pygame2てのが作られていたらしい のだけど。実装しなきゃいけない部分が多岐にわたって作者さんが途中で力尽きて、もうこういう pygame っぽい機能豊富でゴージャスなライブラリは作ってられませんわ開発停止しますわー、となったようで。
その代わり、SDL2の薄いラッパーを目指すぜ、シンプルにするぜ、最低限のことしかしないぜ、やりたいことがあったら自分で頑張って実装してくれよな、と方針が変わって pysdl2 が出てきたのだけど。
薄いラッパーだから、pygame と比べるとユーザ側でやることが増えて使い勝手が悪くなった上に、例えば Windows上で動かす際にはSDL2関係のDLLが必要なのだけど一部のバイナリが配布されてなくて「使いたい人はDLLを自分でビルドしてね」と平然と言われる始末。pygame に比べたら導入すら面倒臭いので、ほとんど誰もあえてわざわざコレを使おうとはしないし誰も使わないからユーザレベルのドキュメントもさっぱり増えないという状況に…。
てな感じの説明で合ってるんですかね? もし間違ってたら誰かツッコミ入れといてください。
◎ pysdl2をインストール。 :
pysdl2自体のインストールは、DOS窓で以下を打つだけ。
が、コレだけでは何もできない。SDL2関連のDLLが別途必要。ここからが…うう…。
pip install pysdl2すんなりインストールできた。素晴らしい。
が、コレだけでは何もできない。SDL2関連のDLLが別途必要。ここからが…うう…。
◎ SDL2関連のDLLを入手。 :
_Installing PySDL2 - PySDL2 0.9.5 documentation
に必要なSDL2関連DLLが列挙されてる。以下から入手できる模様。
_Simple DirectMedia Layer - SDL version 2.0.5 (stable) から、SDL2-2.0.5-win32-*.zip をDL。32bit版と64bit版があるので使いたいほうを。
_SDL_image 2.0 から、SDL2_image-2.0.1-win32-*.zip をDL。
_SDL_mixer 2.0 から、SDL2_mixer-2.0.1-win32-*.zip をDL。
_SDL_ttf 2.0 から、SDL2_ttf-2.0.14-win32-*.zip をDL。
ちとウンザリしてきた…。
しかも、「 _SDL_gfx / SDL2_gfx - ferzkopp.net から SDL2_gfx が入手できるよ」と紹介されてるけど、この SDL2_gfx ってソースしか配布されてなくて。DLL、入ってない。英語圏の掲示板を眺めると、「SDL2_gfx.dll が見つからないんだけど、どこで入手できるの?」という質問に「自分でビルドしろ」と返される光景が何度も出現。pygame使って「ゲームプログラミング、たーのしー!」と思ったであろう初心者達を全力で噛み殺しに来てる…。さすがニシキヘビ…。
そもそもこの SDL2_gfx って、一体何ができるのか、そこからして分からない。オプションと言いつつも、pysdl2 の動作にそこそこ必要になるDLLなの? 別にそれほど必要じゃないの? どっちなの? 正体が分からない。
にしても、いくらなんでも誰もビルドしてないとかあり得ないのでは、とググってたら、 _Windows Binaries - nim-lang/sdl2 Wiki で公開してくれてる方を発見。現行のSDL2は2.0.5だけど、この版は SDL2 2.0.3 なのでちょっぴり古い、けど、手元の環境で試したところ SDL2_gfx.dll 自体は動くようで。ありがたや。
しかしコレ、DLLを入手していくだけでもウンザリするので…。32bit版のDLLを全部まとめて(バックアップも兼ねつつ)こっそりと _ココ に置いときますので面倒臭いなと思った人はどうぞ。「ちょ…おま…ソレ問題あるんじゃねえの?」と不安になった人は各ページを開いてコツコツと一つずつ入手していけば全く同じファイル群が入手できますからどうぞ正規の手順で入手してウンザリして「どこかにまとめて置いとけよ!」と憤っていただければと。自分は憤りました。 *2
_Simple DirectMedia Layer - SDL version 2.0.5 (stable) から、SDL2-2.0.5-win32-*.zip をDL。32bit版と64bit版があるので使いたいほうを。
_SDL_image 2.0 から、SDL2_image-2.0.1-win32-*.zip をDL。
_SDL_mixer 2.0 から、SDL2_mixer-2.0.1-win32-*.zip をDL。
_SDL_ttf 2.0 から、SDL2_ttf-2.0.14-win32-*.zip をDL。
ちとウンザリしてきた…。
しかも、「 _SDL_gfx / SDL2_gfx - ferzkopp.net から SDL2_gfx が入手できるよ」と紹介されてるけど、この SDL2_gfx ってソースしか配布されてなくて。DLL、入ってない。英語圏の掲示板を眺めると、「SDL2_gfx.dll が見つからないんだけど、どこで入手できるの?」という質問に「自分でビルドしろ」と返される光景が何度も出現。pygame使って「ゲームプログラミング、たーのしー!」と思ったであろう初心者達を全力で噛み殺しに来てる…。さすがニシキヘビ…。
そもそもこの SDL2_gfx って、一体何ができるのか、そこからして分からない。オプションと言いつつも、pysdl2 の動作にそこそこ必要になるDLLなの? 別にそれほど必要じゃないの? どっちなの? 正体が分からない。
にしても、いくらなんでも誰もビルドしてないとかあり得ないのでは、とググってたら、 _Windows Binaries - nim-lang/sdl2 Wiki で公開してくれてる方を発見。現行のSDL2は2.0.5だけど、この版は SDL2 2.0.3 なのでちょっぴり古い、けど、手元の環境で試したところ SDL2_gfx.dll 自体は動くようで。ありがたや。
しかしコレ、DLLを入手していくだけでもウンザリするので…。32bit版のDLLを全部まとめて(バックアップも兼ねつつ)こっそりと _ココ に置いときますので面倒臭いなと思った人はどうぞ。「ちょ…おま…ソレ問題あるんじゃねえの?」と不安になった人は各ページを開いてコツコツと一つずつ入手していけば全く同じファイル群が入手できますからどうぞ正規の手順で入手してウンザリして「どこかにまとめて置いとけよ!」と憤っていただければと。自分は憤りました。 *2
◎ DLLを呼び出せるように設定。 :
とりあえず、これで紹介されてるDLL群はあらかた入手できた。zipを解凍して、中に入ってたファイル群をどこか一つのフォルダにまとめて入れておく。重複してるファイルがあったら…タイムスタンプが新しいほうを入れとけばいいんじゃないかな…たぶん…自信無いけど…。
これだけでは、pysdl2 が、各DLLの居場所を知らないままだから呼び出せないので…。OSの環境変数に
環境を汚したくない場合は、DOS窓で
あるいは、Pythonスクリプト側に書いていいなら、スクリプトの最初のほうで環境変数を追加すれば済むようで。 _公式ドキュメント でも、「 _os.environ を使えば環境変数を追加した状態にできるよ」と書いてある。
ここまでやれば、ようやく pysdl2 が使える状態に。
これだけでは、pysdl2 が、各DLLの居場所を知らないままだから呼び出せないので…。OSの環境変数に
PYSDL2_DLL_PATHを追加して、それらDLLが入ってるフォルダを指定しておく。
環境を汚したくない場合は、DOS窓で
set PYSDL2_DLL_PATH=DLLが入ってるフォルダとでも打てば、それ以降は反映されるはず。DOS窓閉じれば設定消えるので次回も設定し直しですが。
あるいは、Pythonスクリプト側に書いていいなら、スクリプトの最初のほうで環境変数を追加すれば済むようで。 _公式ドキュメント でも、「 _os.environ を使えば環境変数を追加した状態にできるよ」と書いてある。
ここまでやれば、ようやく pysdl2 が使える状態に。
◎ サンプルを動かす。 :
pysdl2 がインストールされていれば、Python2.7インストールフォルダ\Lib\site-packages\sdl2\examples\ の中にいくつかサンプルファイルが入ってるので、実行して動作確認ができる。
pong.py と gui.py は、ちょっと注意。例えば、
ソースを眺めてみたら、オプションで切り替えられるようで。
たぶん、デフォルトでハードウェアアクセラレーションを有効にしておくと、環境によっては動作しないとかOSが落ちる等の事例があって、故にデフォルトは安全側に振ってあるのですかねえ…。SDLもそうだったし…。たしか昔のIntel製内蔵GPUがヤバかった…ような…。pygame に限らず、SDLを使ってた Ruby/SDL もコレが理由でパフォーマンスが出なかった記憶が…。
ところで、SDL2_gfx って何に使うのか分からなかった件ですが。
gfxdrawing.py を動かしてみたら、どうやら、線や四角や丸を半透明で描画できるDLLのようで。…正直イラネ。こんなもんのために散々ネットサーフィンさせられたのか。ふざけんな。嘘。言い過ぎました。状況によっては便利なDLLなんだろうけど、コレ、スクリーンショットがもうちょっとあれば正体が分かったんでしょうけど、「Graphics drawing primitives and other support functions wrapped up in an add-on」とスクリーンショット2枚だけでは、ちょっと…。もっと凄いブツが描画できる、pysdl2にはほぼ必須のDLLなのかと想像してしまった…。
まあ、現状、ドキュメントの類がほとんど無いから正体が分からないアレコレがあっても仕方ないですな…。
とりあえず、サンプルは動きました、ということで。しかし…相変わらず導入が面倒臭い…。これじゃ流行らないわ…。
pong.py と gui.py は、ちょっと注意。例えば、
python pong.pyで動かすと、
> python pong.py Using software renderingと表示されて、「ここまで苦労したのに結局ソフトウェアレンダリングかよおお!? 一体何なんだよ、このクソライブラリいい!」と絶望的な気分になるのだけど。
ソースを眺めてみたら、オプションで切り替えられるようで。
> python pong.py -hardware Using hardware accelerationちょっと焦りましたヨ。
たぶん、デフォルトでハードウェアアクセラレーションを有効にしておくと、環境によっては動作しないとかOSが落ちる等の事例があって、故にデフォルトは安全側に振ってあるのですかねえ…。SDLもそうだったし…。たしか昔のIntel製内蔵GPUがヤバかった…ような…。pygame に限らず、SDLを使ってた Ruby/SDL もコレが理由でパフォーマンスが出なかった記憶が…。
ところで、SDL2_gfx って何に使うのか分からなかった件ですが。
gfxdrawing.py を動かしてみたら、どうやら、線や四角や丸を半透明で描画できるDLLのようで。…正直イラネ。こんなもんのために散々ネットサーフィンさせられたのか。ふざけんな。嘘。言い過ぎました。状況によっては便利なDLLなんだろうけど、コレ、スクリーンショットがもうちょっとあれば正体が分かったんでしょうけど、「Graphics drawing primitives and other support functions wrapped up in an add-on」とスクリーンショット2枚だけでは、ちょっと…。もっと凄いブツが描画できる、pysdl2にはほぼ必須のDLLなのかと想像してしまった…。
まあ、現状、ドキュメントの類がほとんど無いから正体が分からないアレコレがあっても仕方ないですな…。
とりあえず、サンプルは動きました、ということで。しかし…相変わらず導入が面倒臭い…。これじゃ流行らないわ…。
◎ 余談。 :
_PythonGames - Python Wiki
で、Pythonで使えるゲームライブラリが色々紹介されてるのでメモ。
個人的には pyglet に期待してたのですが、アレはOpenGLを使うので、AMD/ATI製GPU上では不具合が出たり *3 、Intel Atom の載ってるPCではスプライトすら出なかったりで。 *4 今はどうなんだろう…。
ググってたら、pygame_sdl2 てのもあるみたいですな。
_renpy/pygame_sdl2: Reimplementation of portions of the pygame API using SDL2.
_Pygame_SDL2 Documentation - pygame_sdl2 latest documentation
しかし、Nightly builds のダウンロード先が404という…。「もうすぐ公式リリースが _PyPI に登録できると思うよ」と書いてあるけど、まだ登録されてないっぽい…。
pygame_sdl2 とは別に、pygame-sdl2 てのもあるようで。これはpysdl2に被せた形っぽい。
_ShadowApex/pygame-sdl2: Drop-in SDL2 implementation of Pygame.
ただ、 _Pygame SDL2 : pygame のやり取りの中で、「pygame_sdl2 が出てきたから、もう pygame-sdl2 は作りません」と pygame-sdl2 の作者さんが書いてますな…。
個人的には pyglet に期待してたのですが、アレはOpenGLを使うので、AMD/ATI製GPU上では不具合が出たり *3 、Intel Atom の載ってるPCではスプライトすら出なかったりで。 *4 今はどうなんだろう…。
ググってたら、pygame_sdl2 てのもあるみたいですな。
_renpy/pygame_sdl2: Reimplementation of portions of the pygame API using SDL2.
_Pygame_SDL2 Documentation - pygame_sdl2 latest documentation
しかし、Nightly builds のダウンロード先が404という…。「もうすぐ公式リリースが _PyPI に登録できると思うよ」と書いてあるけど、まだ登録されてないっぽい…。
pygame_sdl2 とは別に、pygame-sdl2 てのもあるようで。これはpysdl2に被せた形っぽい。
_ShadowApex/pygame-sdl2: Drop-in SDL2 implementation of Pygame.
ただ、 _Pygame SDL2 : pygame のやり取りの中で、「pygame_sdl2 が出てきたから、もう pygame-sdl2 は作りません」と pygame-sdl2 の作者さんが書いてますな…。
*1: 「pygameの描画が遅いんですけど…」と質問すると「OpenGLと組み合わせて使え」と言われるのが若干定番な印象。
*2: ていうかホントはコレって pygame 使ってた頃のノリを考えたら pip install pysdl2 をしただけでひとまず全部入る状態が妥当じゃないのかよ何だこの状況てな感じで実は結構ムカムカしてるんですけど。SDL2_gfxのあたりでキレそうになりましたよ。や、ソースを公開してくれてるだけでも大変ありがたいのですが…。しかしpysdl2の使い方を勉強するだけでもこれからユーザに一苦労させるのは間違いないのにソレ以前の導入作業からしてコレでは話にならんだろと。こんなんでpygameの後継ライブラリになるとホントに思ってんのか、これじゃ普及するわけねえだろ何考えてんだ、みたいな。いやまあ、pysdl2 と DLL を分離することでSDL2が更新されるたびに pysdl2 も更新しなきゃみたいな状態を回避できるから負担が減ると踏んでこうしてるのかなと想像するのでそれもそれで分かるのですけど。とは言え開発負荷を下げた結果誰も使えないし使わないライブラリになりましたではそもそも何でコレ作ったのよとなるわけで。さりとて実現不可能な予定を立ててみてもそれもそれでアレですし。実際一回 pygame2 という形でポシャってますから。まあ、色々と難しい…。これではダメだが事情は分かる、事情は分かるんだがこれではダメだろう、みたいな。
*3: _mieki256's diary - pygletがダメなのかと思ったらどうやらRadeonが糞だったらしい話
_mieki256's diary - pyglet + Radeon で描画できない件について
*4: _mieki256's diary - タブレットPCで自作サンプルを動かしてもらった
*2: ていうかホントはコレって pygame 使ってた頃のノリを考えたら pip install pysdl2 をしただけでひとまず全部入る状態が妥当じゃないのかよ何だこの状況てな感じで実は結構ムカムカしてるんですけど。SDL2_gfxのあたりでキレそうになりましたよ。や、ソースを公開してくれてるだけでも大変ありがたいのですが…。しかしpysdl2の使い方を勉強するだけでもこれからユーザに一苦労させるのは間違いないのにソレ以前の導入作業からしてコレでは話にならんだろと。こんなんでpygameの後継ライブラリになるとホントに思ってんのか、これじゃ普及するわけねえだろ何考えてんだ、みたいな。いやまあ、pysdl2 と DLL を分離することでSDL2が更新されるたびに pysdl2 も更新しなきゃみたいな状態を回避できるから負担が減ると踏んでこうしてるのかなと想像するのでそれもそれで分かるのですけど。とは言え開発負荷を下げた結果誰も使えないし使わないライブラリになりましたではそもそも何でコレ作ったのよとなるわけで。さりとて実現不可能な予定を立ててみてもそれもそれでアレですし。実際一回 pygame2 という形でポシャってますから。まあ、色々と難しい…。これではダメだが事情は分かる、事情は分かるんだがこれではダメだろう、みたいな。
*3: _mieki256's diary - pygletがダメなのかと思ったらどうやらRadeonが糞だったらしい話
_mieki256's diary - pyglet + Radeon で描画できない件について
*4: _mieki256's diary - タブレットPCで自作サンプルを動かしてもらった
[ ツッコむ ]
以上です。