2013/05/13(月) [n年前の日記]
#1 [prog] pygletがダメなのかと思ったらどうやらRadeonが糞だったらしい話
結論を先に書くけど。pyglet を使うと Radeon 上では不具合が起きまくりな模様。
ここ数日 pyglet を勉強してたけど。pygletを使ったスクリプトをexe化しても、環境によっては描画が行われなくてハマってしまったり。自分の書き方が間違えているのかなと悩んでいたけど、どうもそうではなかったようで。
NVIDIA と Intel は動いて、ATI(AMD)が動かない。となると、原因はATI(AMD)じゃねえの? と。
「pyglet radeon」あたりの単語でググってみたら、やはりそうだった。 _「Radeon上でpygletを動かしても描画されないよ?」 とか、 _「pygletのサンプルすらRadeonでは動いてねえよ」 という不具合報告が…。Radeon…お前か! お前のせいか! やっぱり未だにRadeonは、ドライバが糞というか、OpenGL関係がダメなのだなあ…。トホホ。
pyglet + Radeon 上での描画については、分かった範囲では以下のような状態になっているらしく。
一応、
_Pyglet/examples/noisy
を微改造して ―― 描画方法を切り替える処理を加えて試してみたら、たしかに blit()だけ描画できて、他の2つはダメだった。
高速に大量の描画ができる、バッチを使った描画が使えないのは痛い。自分のメインPC上ですら ―― スペックは結構そこそこなPC上ですら、バッチ描画とソレ以外で、明らかに処理速度の違いが分かってしまうわけで。そのくらい、バッチ描画は効果があるのだけど、ソレが使えないのは厳しい。
「Radeon がおかしいのではなくて pygletがおかしいのでは?」と一瞬思ったけれど、NVIDIA と Intel では動いてるからなあ…。不具合報告を眺めてると、頂点座標として int を渡すとダメで、float を渡せば違ってくる、みたいな話も出ているように見える。もしかしてソレは、PyOpenGL あたりも同様だったりするのだろうか? そういや、先日書いて試してたPyOpenGL使用スクリプトは、v?f しか使ってなかった。たまたまそうしちゃってたから、動いてたのかな…?
「最近のドライバでは直ってるかも?」てな話も見かけたので Catalyst13.1 をインストールしてみたのだけど。残念ながら変化なし。ちなみに、かなり昔のバージョンのドライバなら不具合が出ないという話も。どうなってんだろ…。
とりあえず、Radeon が載ってるPC上では何一つ描画できない、描画できてもSDL並みに遅い、なんて状態はダメダメ過ぎるわけで。この調子では、何かしらを作ろうとする際に、pyglet を選択肢に入れるわけにはいかんよなと…。Radeon が載ってるPCは多いのだし…。
余談。 _OpenGL Extensions Viewer をインストールして対応状況を調べてみたけど。GeForce 9800GTGE も Radeon HD4200 も 3.3 まで対応と表示された。レンダリングテストも一応見た目は問題無いように見える。こうなると、pyglet がおかしいという話に持っていかれそうな…。いや、たぶんおかしいのは ATI・Radeon だけど、おそらく他のアレコレは、不具合を回避する方向で、何かを犠牲にした実装をしてそうな予感。ATI に直してくれと要望出しても、どうせ期待できないし。あそこは昔からそのへん酷いから。
そういや昔の Shade も、「Radeon ユーザは、動くドライババージョンを自分で探してください…」みたいな注意書きをしてた記憶が…。
ここ数日 pyglet を勉強してたけど。pygletを使ったスクリプトをexe化しても、環境によっては描画が行われなくてハマってしまったり。自分の書き方が間違えているのかなと悩んでいたけど、どうもそうではなかったようで。
PC種類 | ビデオチップ | 描画結果 |
---|---|---|
メインPC | NVIDIA GeForce9800GTGE | OK |
録画用PC | ATI Radeon HD4200 (AMD 785G) | NG |
ネットブック機 | Intel 945GSE (GMA950) | OK |
「pyglet radeon」あたりの単語でググってみたら、やはりそうだった。 _「Radeon上でpygletを動かしても描画されないよ?」 とか、 _「pygletのサンプルすらRadeonでは動いてねえよ」 という不具合報告が…。Radeon…お前か! お前のせいか! やっぱり未だにRadeonは、ドライバが糞というか、OpenGL関係がダメなのだなあ…。トホホ。
pyglet + Radeon 上での描画については、分かった範囲では以下のような状態になっているらしく。
pyglet.graphics.Batch | NG |
pyglet.sprite.Sprite.draw() | NG |
pyglet.image.AbstractImage.blit() | OK |
高速に大量の描画ができる、バッチを使った描画が使えないのは痛い。自分のメインPC上ですら ―― スペックは結構そこそこなPC上ですら、バッチ描画とソレ以外で、明らかに処理速度の違いが分かってしまうわけで。そのくらい、バッチ描画は効果があるのだけど、ソレが使えないのは厳しい。
「Radeon がおかしいのではなくて pygletがおかしいのでは?」と一瞬思ったけれど、NVIDIA と Intel では動いてるからなあ…。不具合報告を眺めてると、頂点座標として int を渡すとダメで、float を渡せば違ってくる、みたいな話も出ているように見える。もしかしてソレは、PyOpenGL あたりも同様だったりするのだろうか? そういや、先日書いて試してたPyOpenGL使用スクリプトは、v?f しか使ってなかった。たまたまそうしちゃってたから、動いてたのかな…?
「最近のドライバでは直ってるかも?」てな話も見かけたので Catalyst13.1 をインストールしてみたのだけど。残念ながら変化なし。ちなみに、かなり昔のバージョンのドライバなら不具合が出ないという話も。どうなってんだろ…。
とりあえず、Radeon が載ってるPC上では何一つ描画できない、描画できてもSDL並みに遅い、なんて状態はダメダメ過ぎるわけで。この調子では、何かしらを作ろうとする際に、pyglet を選択肢に入れるわけにはいかんよなと…。Radeon が載ってるPCは多いのだし…。
余談。 _OpenGL Extensions Viewer をインストールして対応状況を調べてみたけど。GeForce 9800GTGE も Radeon HD4200 も 3.3 まで対応と表示された。レンダリングテストも一応見た目は問題無いように見える。こうなると、pyglet がおかしいという話に持っていかれそうな…。いや、たぶんおかしいのは ATI・Radeon だけど、おそらく他のアレコレは、不具合を回避する方向で、何かを犠牲にした実装をしてそうな予感。ATI に直してくれと要望出しても、どうせ期待できないし。あそこは昔からそのへん酷いから。
そういや昔の Shade も、「Radeon ユーザは、動くドライババージョンを自分で探してください…」みたいな注意書きをしてた記憶が…。
◎ 描画されるかどうかの確認用サンプル。 :
一応、前述の動作サンプルも置いておくです。
_noisy_drawtest_20130513.zip
_noisy_drawtest_20130513.zip
- 解凍して、dist/noisy_drawtest.exe を実行すれば動く…はず。たぶん。
- スペースキーを押すとボールが増える。
- Zキーで3種類の描画方法を切り替え。
- Radeon系は描画方法を「blit()」にしないとボールが表示されない。と思う。ドライババージョンによって結果が違う可能性有り。
◎ pyglet の lib.py も修正が必要らしい。 :
_Fix checking for unexpected errors while loading a library - 6aaa0e5 - mammadori/pyglet - GitHub
_History for pyglet/lib.py - mammadori/pyglet - GitHub
昨日、pyglet を使ったスクリプトを py2exe でexe化した際、.exe を実行するとエラーが出て困ってたのだけど。どうやら lib.py の該当部分を GitHub 上の最新版と同様に修正すれば、そのエラーは出なくなる模様。たぶん。
_History for pyglet/lib.py - mammadori/pyglet - GitHub
昨日、pyglet を使ったスクリプトを py2exe でexe化した際、.exe を実行するとエラーが出て困ってたのだけど。どうやら lib.py の該当部分を GitHub 上の最新版と同様に修正すれば、そのエラーは出なくなる模様。たぶん。
◎ 2017/03/19追記。 :
Dropboxのpublicフォルダが死んだのでファイルの置き場所を変更。
[ ツッコむ ]
#2 [prog] pyinstallerも試用してみたのだけど。
Windows上で、Pythonスクリプト(.py)をexe化できるツールは、いくつかあるようで。
_py2exe
_PyInstaller
_cx_Freeze
_bbfreeze
英語圏の掲示板で、「pygletを使ったスクリプトをexe化するならPyinstallerがいいよ!」と言ってる人が居るみたいなので、ちと試してみようかなと。
ダメだった。
巷の解説記事は、Pyinstaller 1.5 あたりのものがほとんどで。現在のバージョンは 2.0 だから、ちょっと中身があってないような。
インストール方法は…。pyinstaller-2.0.zip をDLして解凍してどこかに置いとけば終わり、らしい。後は、
_py2exe
_PyInstaller
_cx_Freeze
_bbfreeze
英語圏の掲示板で、「pygletを使ったスクリプトをexe化するならPyinstallerがいいよ!」と言ってる人が居るみたいなので、ちと試してみようかなと。
ダメだった。
AccessInit: hash collision: 3 for both 1 and 1と表示されて、処理が途中で止まってるように見える…。それとも自分の使い方がおかしいのだろうか?
巷の解説記事は、Pyinstaller 1.5 あたりのものがほとんどで。現在のバージョンは 2.0 だから、ちょっと中身があってないような。
インストール方法は…。pyinstaller-2.0.zip をDLして解凍してどこかに置いとけば終わり、らしい。後は、
python pyinstaller.py exe化したい.pyのパスでOKっぽい。が、自分の手元では成功せず。
[ ツッコむ ]
#3 [prog] pygletのサンプル
ここ数日弄ってた pyglet の動作確認サンプルも一応アップロードしておこうかと。やたら長くなったから、@wiki にアップしておくです。
_mieki256 @ ウィキ - pygletでフルスクリーン表示等をするサンプル
_fullscrpyglet.py
_setup.py
_ファイル一式(fullscrpyglet_20130513.zip)
ジョイスティックの読み取りその他、色々やってるです。
pygame 使うより pyglet 使うほうが高速に処理できるのでオススメ、と言いたいところなのだけど、しかし前述の通り、現状では Radeon が載ってるPC上で描画されないという不具合があるわけで…。NVIDIA か Intel のビデオチップ使ってる人しか利用できない。それが今現在の pyglet。みたいな。なんとも残念な結果に。
_mieki256 @ ウィキ - pygletでフルスクリーン表示等をするサンプル
_fullscrpyglet.py
_setup.py
_ファイル一式(fullscrpyglet_20130513.zip)
ジョイスティックの読み取りその他、色々やってるです。
pygame 使うより pyglet 使うほうが高速に処理できるのでオススメ、と言いたいところなのだけど、しかし前述の通り、現状では Radeon が載ってるPC上で描画されないという不具合があるわけで…。NVIDIA か Intel のビデオチップ使ってる人しか利用できない。それが今現在の pyglet。みたいな。なんとも残念な結果に。
◎ 2017/03/19追記。 :
Dropboxのpublicフォルダが死んだのでファイルの置き場所を変更。
[ ツッコむ ]
以上、1 日分です。