超久々に趣味のプログラミングのお話。元々しんさんの出張所ではWebアプリのお話などはあんまり扱うような場所ではなかったが、この2年くらいそっち方面が多すぎたような気がする。つまり、今回のようなエントリこそがこのサイトの本来の姿。
どうやら初期化のタイミングがウインドウモードとフルスクリーンモードと違うおかげでいままでJOGLでフルスクリーンモードの不具合があると思っていたようだ。というか、あんなのわからんだろ…。
面白いのがJavaSE6u10以降とu7以前(JDK5.0含む)とでフルスクリーン時の動作が異なるということ。GLJPanelは今まではどのモードでも垂直同期をしない描画だが、フルスクリーン時にはu10以降はちゃんと同期を取るようになったようだ。
垂直同期をまとめると以下のようになる。
JDK | ウインドウモード | フルスクリーンモード |
---|---|---|
J2SE 5.0-GLCanvas | ○ | ○ |
J2SE 5.0-GLJPanel | × | × |
Java SE 6 u7まで-GLCanvas | ○ | ○ |
Java SE 6 u7まで-GLJPanel | × | × |
Java SE 6 u10以降-GLCanvas | ○ | ○ |
Java SE 6 u10以降-GLJPanel | × | ○ |
描画パイプラインの変更によるものかな。ちなみにこれはWindowsのお話。JavaでクライアントプログラムでWindows以外のほうがめずらしいからまぁいいか。Java2Dの大幅な性能アップとかほとんどWindowsのみのお話だしね。あとJava2DアクセラレーションはnVidiaとATIのチップのみの対応なのでJOGLのこの動作も変わる可能性がある。今回のテストではGeforce使ってるので参考までに。ノートPCもってるのでIntelの統合チップセットのテストも出来ると思う。あとで調べてみよう。
以前調べた範囲だとアスペクト比の固定がIntelの統合チップだとうごいていないっぽいのでワイドスクリーンが当たり前になった現在では、フルスクリーンモードを実装するか、現在の擬似的なフルスクリーンモードにするべきかは非常に悩む。ただ、擬似的なフルスクリーンモードは解像度変更をしていないので負担が高いのが癌。
負荷具合によっては無理をしても変えるべきか、選択できるようにするかいろいろと悩む。またえふおうさんのノートPCで快適に動くのがどちらかのテストをしてもらおうかな。VistaだとどうもOpenGLの負荷が高い気がする。場合によってはJava2Dそのまま使ったほうが実装がDirect3DなのでVistaとの相性は一番良く、軽い気がする。
もっともJava2Dのαブレンディングがまともに実装されてさえいれば2DゲーではOpenGLなど使わずにすむんだけどなー。
ちなみにフルスクリーンからの復帰をするとDirect3Dによる描画モードにしていた場合NetBeansの描画が崩れて復帰しないので注意。
- J-Dsun.java2d.noddraw=true
ゲーム開発する場合はNetBeansの環境設定ファイルに上記オプションをを入れておいたほうが良いと思う。ちなみにデフォルトで入っているので環境設定ファイルをいじっていない人は気にしなくて良い。
ゲーム開発の場合ライブラリはきっちりかっちりJavaで作って実装部分はGroovyとかよさげな予感。たぶんBASICの感覚に一番近くなるはず。