2024/04/03(水) [n年前の日記]
#1 [prog][windows] Windows用の自作スクリーンセーバが動かない問題の回避策が分かった
_昨日、
C++ (MinGW g++ 6.3.0)とOpenGLで自作したWindows用スクリーンセーバが、サブPC上で起動したりしなかったりする問題で悩んでいた。症状は以下。
サブPCのスペックは以下。
原因が分かった。デスクトップ解像度だった。
サブPC上で選択できる最大解像度、1920x1200にしていると、この問題が起きてしまう。しかし、Windowsのデスクトップ解像度設定画面で「(推奨)」と表示されている1920x1080にすると、何の問題もなく一発でスクリーンセーバが起動するようになった。
そこかよ…。スクリーンセーバの作り方がまずかったわけではないのだな…。
このあたり、サブPCの内蔵GPU (Radeon R3, GCN世代)のスペックに絡む問題なのか、それとも、HDMI接続している液晶ディスプレイ MITSUBISHI MDT243WG-SB の問題なのか、一体どのへんが絡んでるのか分からないけれど、どうもこのサブPCは、デスクトップ解像度を1920x1200にして利用しようとすると、こういったところで妙な問題が発生するようだなと…。それともまさか、使っているHDMIケーブルのスペックの問題なのだろうか…?
何にせよ、なんだか動作が変だなと思ったら、「(推奨)」と表示されてるデスクトップ解像度に変えてみるのもアリ。なのかもしれない。
なんだかこの件はそのうち忘れそう。覚えていられる自信がない…。
- 初回呼び出し時は、画面が一瞬チラついて、すぐにスクリーンセーバが終了してしまう。
- そのまま放置しておいて2回目の呼び出しがかかると、今度はちゃんと起動する。
サブPCのスペックは以下。
- 内蔵GPU: Radeon R3, GCN世代。
- 液晶ディスプレイ: MITSUBISHI MDT243WG-SB (最大1920x1200)
原因が分かった。デスクトップ解像度だった。
サブPC上で選択できる最大解像度、1920x1200にしていると、この問題が起きてしまう。しかし、Windowsのデスクトップ解像度設定画面で「(推奨)」と表示されている1920x1080にすると、何の問題もなく一発でスクリーンセーバが起動するようになった。
そこかよ…。スクリーンセーバの作り方がまずかったわけではないのだな…。
このあたり、サブPCの内蔵GPU (Radeon R3, GCN世代)のスペックに絡む問題なのか、それとも、HDMI接続している液晶ディスプレイ MITSUBISHI MDT243WG-SB の問題なのか、一体どのへんが絡んでるのか分からないけれど、どうもこのサブPCは、デスクトップ解像度を1920x1200にして利用しようとすると、こういったところで妙な問題が発生するようだなと…。それともまさか、使っているHDMIケーブルのスペックの問題なのだろうか…?
何にせよ、なんだか動作が変だなと思ったら、「(推奨)」と表示されてるデスクトップ解像度に変えてみるのもアリ。なのかもしれない。
なんだかこの件はそのうち忘れそう。覚えていられる自信がない…。
◎ OpenGLを使わなければ問題無い :
試行錯誤した際に一応分かった点をメモしておく。
まず、OpenGLを使ってないスクリーンセーバなら、解像度が1920x1200でも、こういった問題は起きない。
例えば、以下で、OpenGLを使っていないスクリーンセーバのサンプルコードが紹介されているけれど、これをビルドして、スクリーンセーバ(*.scr)にして試した際は、解像度が1920x1200でも、何の問題もなく一発ですんなりと起動することが分かった。
_Screen Saver 入門 (WebArchive)
また、以下で紹介されてるサンプルコード、もしくは自分が書いたコードは、OpenGLを使っているスクリーンセーバだけど。1920x1200では、例の不具合が ―― 1回目の呼び出しですぐ終了して、2回目の呼び出しで起動成功する不具合が発生した。そして1920x1080なら、そういった問題は発生しない。どのスクリーンセーバも一発でちゃんと起動した。
_Windows - OpenGLスクリーンセーバーサンプル: インディーズゲームデベロッパー「OMEGA POINT」
_How to Scr: Writing an OpenGL Screensaver for Windows
_mieki256/glboundballscr: Bound ball animation screensaver win32 by using OpenGL.
更に、以下はソースコードは公開されてなくて実行バイナリしかないスクリーンセーバだけど、これもOpenGLを使っているので、1920x1200では件の不具合が発生して、1920x1080なら一発で起動した。
_TeapotGLスクリーンセーバーの詳細情報 : Vector ソフトを探す!
そんなわけで、「OpenGLを使っていて」、かつ、「(推奨)」と表示されていないデスクトップ解像度にしている場合、件の不具合が発生する可能性が出てくるらしい。
まず、OpenGLを使ってないスクリーンセーバなら、解像度が1920x1200でも、こういった問題は起きない。
例えば、以下で、OpenGLを使っていないスクリーンセーバのサンプルコードが紹介されているけれど、これをビルドして、スクリーンセーバ(*.scr)にして試した際は、解像度が1920x1200でも、何の問題もなく一発ですんなりと起動することが分かった。
_Screen Saver 入門 (WebArchive)
また、以下で紹介されてるサンプルコード、もしくは自分が書いたコードは、OpenGLを使っているスクリーンセーバだけど。1920x1200では、例の不具合が ―― 1回目の呼び出しですぐ終了して、2回目の呼び出しで起動成功する不具合が発生した。そして1920x1080なら、そういった問題は発生しない。どのスクリーンセーバも一発でちゃんと起動した。
_Windows - OpenGLスクリーンセーバーサンプル: インディーズゲームデベロッパー「OMEGA POINT」
_How to Scr: Writing an OpenGL Screensaver for Windows
_mieki256/glboundballscr: Bound ball animation screensaver win32 by using OpenGL.
更に、以下はソースコードは公開されてなくて実行バイナリしかないスクリーンセーバだけど、これもOpenGLを使っているので、1920x1200では件の不具合が発生して、1920x1080なら一発で起動した。
_TeapotGLスクリーンセーバーの詳細情報 : Vector ソフトを探す!
そんなわけで、「OpenGLを使っていて」、かつ、「(推奨)」と表示されていないデスクトップ解像度にしている場合、件の不具合が発生する可能性が出てくるらしい。
◎ スクリーンセーバじゃなければ問題無い :
念のために一応書いておくけれど、スクリーンセーバではなく、GLFWで新規にウインドウを作成してOpenGLで描画する分には、デスクトップ解像度が1920x1200でも問題無く動作した。
つまり、OpenGLの勉強をするだけなら、この問題には遭遇しない予感。フツーは GLUT や GLFW を使って実験するだろうから。
「せっかくここまで作ったんだから、試しにスクリーンセーバにでもしてみようかな」
「選択できる最大解像度で動作確認しておかないとマズイだろう」
などと欲を出して(?)作業をし始めると、こうしてハマる。でもまあ、Windows上で「(推奨)」と表示されてるデスクトップ解像度で動かしてる分には、この問題には遭遇しないだろうけど…。たぶん。
つまり、OpenGLの勉強をするだけなら、この問題には遭遇しない予感。フツーは GLUT や GLFW を使って実験するだろうから。
「せっかくここまで作ったんだから、試しにスクリーンセーバにでもしてみようかな」
「選択できる最大解像度で動作確認しておかないとマズイだろう」
などと欲を出して(?)作業をし始めると、こうしてハマる。でもまあ、Windows上で「(推奨)」と表示されてるデスクトップ解像度で動かしてる分には、この問題には遭遇しないだろうけど…。たぶん。
[ ツッコむ ]
以上です。