2018/11/07(水) [n年前の日記]
#1 [python] pygameについて調べ直したり
pygame は今現在どうなってるのかと思ってググったら、どうやら SDL2 を使った pygame 2 とやらが開発中らしいと知り。
_pygame 2 status - 5 Nov, 2018
なんだか嬉しいニュースだなと。Python で2Dゲーム制作というと、手軽だけど描画が遅い pygame が使われてしまう事例が多くて、この状況はどうなんだともやもやしていたものだけど。ハードウェアによる描画がデフォルトらしい SDL2 が使われるなら、そのあたりの状況が改善しそう。
それにしても、これは以前始まったけど途中で止まってしまったプロジェクトの再開なのか、それとも新規に始まったプロジェクトなのか、どっちなんだろう…。
pygame の後継ライブラリの流れについては…たしか以前、簡単にメモしてた気がする…。うむ…メモしてあった。
_mieki256's diary - pysdl2をほんの少しだけ試用
_pygame 2 status - 5 Nov, 2018
なんだか嬉しいニュースだなと。Python で2Dゲーム制作というと、手軽だけど描画が遅い pygame が使われてしまう事例が多くて、この状況はどうなんだともやもやしていたものだけど。ハードウェアによる描画がデフォルトらしい SDL2 が使われるなら、そのあたりの状況が改善しそう。
それにしても、これは以前始まったけど途中で止まってしまったプロジェクトの再開なのか、それとも新規に始まったプロジェクトなのか、どっちなんだろう…。
pygame の後継ライブラリの流れについては…たしか以前、簡単にメモしてた気がする…。うむ…メモしてあった。
_mieki256's diary - pysdl2をほんの少しだけ試用
◎ 余談。 :
pygame も、デフォルトはソフトウェア描画だから遅いけど、ハードウェア描画を可能にする機能・設定もあるようで。
ただ、当時のIntel製GPU ―― CPUではなくチップセットにGPUが内蔵されてた時代のドライバがクソで、ハードウェア描画の設定にすると画面が描画されない不具合が多発して。
ノートPCの類は内蔵GPUが当たり前だから、PC市場のシェアを考えてもIntel製GPUを無視するわけにもいかないし、そのあたりの処理は SDL 1.x にお任せしてるから pygame側で何かしら対策するのも難しい…。
そんな理由で、「pygameを使うなら、かつ、色んな環境で確実に動かしたいなら、ソフトウェア描画以外はオススメしませんよ」という流れになったわけで。
描画に pygame を使わず、OpenGLを制御できるモジュール(PyOpenGL等)を使って高速に描画する、という構成もあるのだけど。それだとソースがゴチャゴチャしちゃうし、OpenGL に関しては、Intel製GPUのみならず、AMD/ATI製GPUのドライバも輪をかけてクソで…。
故に、手軽に使えるけど遅い、というのが pygame の評価だったけれど、そのあたりが改善されそうなので、pygame 2 に期待せずには居られないのです。
ただ、当時のIntel製GPU ―― CPUではなくチップセットにGPUが内蔵されてた時代のドライバがクソで、ハードウェア描画の設定にすると画面が描画されない不具合が多発して。
ノートPCの類は内蔵GPUが当たり前だから、PC市場のシェアを考えてもIntel製GPUを無視するわけにもいかないし、そのあたりの処理は SDL 1.x にお任せしてるから pygame側で何かしら対策するのも難しい…。
そんな理由で、「pygameを使うなら、かつ、色んな環境で確実に動かしたいなら、ソフトウェア描画以外はオススメしませんよ」という流れになったわけで。
描画に pygame を使わず、OpenGLを制御できるモジュール(PyOpenGL等)を使って高速に描画する、という構成もあるのだけど。それだとソースがゴチャゴチャしちゃうし、OpenGL に関しては、Intel製GPUのみならず、AMD/ATI製GPUのドライバも輪をかけてクソで…。
故に、手軽に使えるけど遅い、というのが pygame の評価だったけれど、そのあたりが改善されそうなので、pygame 2 に期待せずには居られないのです。
[ ツッコむ ]
#2 [python] 手元のPCに入ってるPythonのモジュールをアップデート
ふとなんとなく、手元の環境、Windows10 x64 + Python 2.7.12 上でインストールしていたモジュールについて、アップデート作業をしてみたり。
まずは Pthon 2.7.12 を 2.7.15 にアップグレード。公式サイトから python-2.7.15.msi をダウンロードして実行。Python 2.7.12 が入ってるフォルダに上書きインストール。
本当に上書きでいいのだろうか。一旦アンインストールしてからインストールしたほうが良くないか。しかしその場合、別途インストールしていた各モジュールはどうなるのだろう。なんだか怖いので毎回上書きしちゃってるけど…コレっていいのかなあ…。
DOS窓を開いて python のバージョンを確認。
モジュールをアップデート。まずは更新可能なモジュールの一覧を表示。
一つずつアップデート。
依存関係がよろしくないモジュールがいくつかあったような気がするけれど…問題が出てから対処しよう…。
pycairo、pygobject はアップデートできなかった。ビルドするための環境が必要らしい。prompt-toolkit も、ドキュメントには 1.x と 2.x で仕様が違うと書いてあったので、アップデートしなかった。
まずは Pthon 2.7.12 を 2.7.15 にアップグレード。公式サイトから python-2.7.15.msi をダウンロードして実行。Python 2.7.12 が入ってるフォルダに上書きインストール。
本当に上書きでいいのだろうか。一旦アンインストールしてからインストールしたほうが良くないか。しかしその場合、別途インストールしていた各モジュールはどうなるのだろう。なんだか怖いので毎回上書きしちゃってるけど…コレっていいのかなあ…。
DOS窓を開いて python のバージョンを確認。
> python --version Python 2.7.15
モジュールをアップデート。まずは更新可能なモジュールの一覧を表示。
pip list --o
一つずつアップデート。
pip install -U hoge
依存関係がよろしくないモジュールがいくつかあったような気がするけれど…問題が出てから対処しよう…。
pycairo、pygobject はアップデートできなかった。ビルドするための環境が必要らしい。prompt-toolkit も、ドキュメントには 1.x と 2.x で仕様が違うと書いてあったので、アップデートしなかった。
◎ pygletのサウンド関係が変わってた。 :
pyglet を 1.3.2 にアップデートしたら、昔書いたスクリプトが動かなくなった。どうやらサウンド関係の仕様が変わってしまったらしい。
自分、以前はどのバージョンを使っていたのだったか…。
_mieki256's diary - pygletを1.3.0rc1にしてみたら遅くなった
どうやら 1.2.4 か 1.3.0rc1 を使っていたと思われる。
さておき、変更点をメモ。pyglet はデフォルト状態だと wavファイルしか鳴らせないので、avbin なるものを導入 *1 して、mp3 や ogg も再生できるようにしてからスクリプトを書いたのだけど。その avbin 関係が少し変わってるように見えた。
それと、ループ再生の仕方が変わってた。
以前は以下のような感じで呼んでたけど。
pyglet.media.ManagedSoundPlayer は無くなって、「pyglet.media.Player を使え」という仕様になったようで。
_pyglet.media - pyglet v1.2.4
また、EOS_LOOP は無くなって、「SourceGroup.loop を使え」という仕様になった模様。
_Player Class - pyglet v1.2.4
_python - Haven't changed my code but it stopped working: `object has no attribute 'EOS_LOOP'` - Stack Overflow
ゲーム関係のライブラリやツールって、バージョンによって仕様がコロコロ変わるところがあるからなんだかアレだなと。Unity もそうだったし…。まあ、ゲームが完成したらそこでプロジェクト終了、みたいな昔風のノリがちょっと残っているのだろう…。
自分、以前はどのバージョンを使っていたのだったか…。
_mieki256's diary - pygletを1.3.0rc1にしてみたら遅くなった
どうやら 1.2.4 か 1.3.0rc1 を使っていたと思われる。
さておき、変更点をメモ。pyglet はデフォルト状態だと wavファイルしか鳴らせないので、avbin なるものを導入 *1 して、mp3 や ogg も再生できるようにしてからスクリプトを書いたのだけど。その avbin 関係が少し変わってるように見えた。
- avbin のバージョンを調べる、pyglet.media.avbin.get_version() が見当たらない。
- avbin が使えるかどうかを調べる pyglet.media.have_avbin を pyglet.media.have_avbin() の形で呼ばないと True , False を返してくれない。ただ、コレは以前のスクリプトで記述ミスをしていた可能性もありそう。
それと、ループ再生の仕方が変わってた。
以前は以下のような感じで呼んでたけど。
self.sndplayer = pyglet.media.ManagedSoundPlayer() self.sndplayer.queue(self.bgm_src) self.sndplayer.eos_action = self.sndplayer.EOS_LOOP # ループ再生を設定 self.sndplayer.play() # 再生開始pyglet 1.3.2 は以下のように書いたらループ再生してくれた。
self.loop_music = pyglet.media.SourceGroup(self.bgm_src.audio_format, None) self.sndplayer = pyglet.media.Player() self.loop_music.queue(self.bgm_src) self.loop_music.loop = True # ループ再生を設定 self.sndplayer.queue(self.loop_music) self.sndplayer.play() # 再生開始
pyglet.media.ManagedSoundPlayer は無くなって、「pyglet.media.Player を使え」という仕様になったようで。
_pyglet.media - pyglet v1.2.4
また、EOS_LOOP は無くなって、「SourceGroup.loop を使え」という仕様になった模様。
_Player Class - pyglet v1.2.4
_python - Haven't changed my code but it stopped working: `object has no attribute 'EOS_LOOP'` - Stack Overflow
ゲーム関係のライブラリやツールって、バージョンによって仕様がコロコロ変わるところがあるからなんだかアレだなと。Unity もそうだったし…。まあ、ゲームが完成したらそこでプロジェクト終了、みたいな昔風のノリがちょっと残っているのだろう…。
*1: Windowsの場合、avbin.dll をスクリプトと同じ場所に置く。
[ ツッコむ ]
以上、1 日分です。