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フォルダが死んだのでファイルの置き場所を変更。
[ ツッコむ ]
以上です。