mieki256's diary



2013/05/13(月) [n年前の日記]

#1 [prog] pygletがダメなのかと思ったらどうやらRadeonが糞だったらしい話

結論を先に書くけど。pyglet を使うと Radeon 上では不具合が起きまくりな模様。

ここ数日 pyglet を勉強してたけど。pygletを使ったスクリプトをexe化しても、環境によっては描画が行われなくてハマってしまったり。自分の書き方が間違えているのかなと悩んでいたけど、どうもそうではなかったようで。
PC種類ビデオチップ描画結果
メインPCNVIDIA GeForce9800GTGEOK
録画用PCATI Radeon HD4200 (AMD 785G)NG
ネットブック機Intel 945GSE (GMA950)OK
NVIDIA と Intel は動いて、ATI(AMD)が動かない。となると、原因はATI(AMD)じゃねえの? と。

「pyglet radeon」あたりの単語でググってみたら、やはりそうだった。 _「Radeon上でpygletを動かしても描画されないよ?」 とか、 _「pygletのサンプルすらRadeonでは動いてねえよ」 という不具合報告が…。Radeon…お前か! お前のせいか! やっぱり未だにRadeonは、ドライバが糞というか、OpenGL関係がダメなのだなあ…。トホホ。

pyglet + Radeon 上での描画については、分かった範囲では以下のような状態になっているらしく。
pyglet.graphics.BatchNG
pyglet.sprite.Sprite.draw()NG
pyglet.image.AbstractImage.blit()OK
一応、 _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 ユーザは、動くドライババージョンを自分で探してください…」みたいな注意書きをしてた記憶が…。

描画されるかどうかの確認用サンプル。 :

一応、前述の動作サンプルも置いておくです。

_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 上の最新版と同様に修正すれば、そのエラーは出なくなる模様。たぶん。

2017/03/19追記。 :

Dropboxのpublicフォルダが死んだのでファイルの置き場所を変更。

#2 [prog] pyinstallerも試用してみたのだけど。

Windows上で、Pythonスクリプト(.py)をexe化できるツールは、いくつかあるようで。

_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。みたいな。なんとも残念な結果に。

2017/03/19追記。 :

Dropboxのpublicフォルダが死んだのでファイルの置き場所を変更。

以上、1 日分です。

過去ログ表示

Prev - 2013/05 - Next
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project