kowさんは天ざる大好き

創作に絶望すると、世界が反転した日記

SDL+OpneGLでWindowとFullscreenを切り替える (2)

システムパーツで Window / FullScreen の切り替えができるようにするから、このボタンもつくってちょ。
と大見得をきったからして、実装を真面目に考えていた。

前にテストした(id:kowasuhito:20051108)方法では、いまいちあかんことがわかった。
あれだと、解像度切り替えた後に、画面に意味のないゴミテクスチャが大量に現れる。
たとえば、背景画像があったとすると、解像度切り替え後、その画像がキャラクタテクスチャに変わっていて、640*480でキャラクタが背景として表示されたりする。
ちゃんとリストアできてないんかいな...


解像度切り替えたあとに読み込んだテクスチャは正常に表示される。
この事実はかわらない。ここをよりどころに問題点を考えた。

そこでおや、と思ったところが一つ。
リストアするときに、過去に登録したテクスチャを解放して、再読込を行う。
このテクスチャの解放。これは解像度変わる前のテクスチャで、それを変更後リリースする。これはおかしい。解像度変更でOpenGLは再初期化されていると考えると、解像度変更前に登録されたテクスチャとは対応しない。


解像度を変更する前に、全ての登録したテクスチャを解放しておく必要がある!
そのあと、すべてのテクスチャを読み込みしなおせばいいのでは!


OpenGLプログラミングガイド、赤本にはそんな変なテクニックは書かれていないので、これは憶測で実装した。
するとこれが、案外うまくいった。

やっと Window と FullScreen の切り替えがでけた。
もちろん、リストアという高いコストを払うわけで、これに関してはSDLをもっと研究して、本当にそれしかできないのか、以前のテクスチャをそのまま解像度変更後も使えないのか、追求していかなくてはならないんだけど...
はっきりいって、リストアのコストは高い。ファイルからの再読込という処理も重いし、SDL_Surfaceからテクスチャを生成した場合には、それをオリジナルとして、ピクセルデータをメモリに保持していなければならない。floorする前であっても、そのサイズはちょっとバカにならない...