2011年9月19日(月)
|
クイッククイック!
今日は919ソニー損保の日。
そして我等が西川貴教の誕生日。
西川ちゃん誕生日おめでとう!
青森に行った時のことを書こう書こう思ってたのだけど、書くの面倒ですっかりほったからしにしてしまっていたよ。
でも今日はまたアプリのことを。
公開していたAndroidのアプリだけど、どうも一部端末・・・具体的に言うとGalaxySでハングしまくるらしく。
それ以外にもIS03で画面キャプチャが上手くいっていなかった。
それがようやく解決できたから嬉しさのあまり、そしてまた同じミスをしないように備忘録として書いておこうと思いまして!
まずぎゃらくしーのやつ。
OpenGLで画像を描画するときは画像をテクスチャという形で読み込んで、そのテクスチャを貼り付けて描画していくのだけど、テクスチャを作るときに作ったテクスチャにユニークなIDを割り当てて管理するのね。
例えば、主人公の画像はテクスチャID1番、マップの画像はテクスチャID2番・・・みたいな。
で、このIDはOpenGLの関数・・・glGenTexturesを使うことで勝手に割り当ててくれるのだけど、当初MEDIASちゃんで動作確認していたところ、このIDには正の整数が割り当てられてたわけなのですよ。
だから、ID格納用の変数が1以上ならテクスチャが割り当てられてるって判断してたのね。
そしたらそれがダメだったようで、どうもGalaxyだけはこのIDに負の整数も割り当てられてしまうみたいで。
憶測になるけど多分コレ、チップによって動作が変わってくるみたい。
そのせいでGalaxyだけフリーズやハングが頻発するという悲惨なことに・・マジ罠過ぎる。
次、IS03での画面キャプチャのやつ。
これはIS03ちゃんが悪い訳ではなく、多分OpenGL ESの仕様になるのかもしれない。
まず大前提でIS03の画面解像度が960*640.
で、OpenGLはビューポートを使うことで画面解像度を好きなようにいじれる・・というと語弊があるかもしれないけど、画面の端から反対側の端までの長さを任意の値を設定して扱うことが出来るのです。
例えば横幅を1に設定すれば左端が0、真ん中が0.5、右端が1・・という風に扱える。
それでうちのアプリの場合、それを800*480として設定して扱っていたのね。
現在発売されている主要なスマフォの解像度に合わせた数字にしております。
そしてそれが見事に罠に。
OpenGLで画面をキャプチャする場合glReadPixelsという関数を使うのだけど、どうもこれがビューポートの設定をガン無視しやがるようで。
つまり、うちのアプリで画面いっぱいキャプチャしようと思って範囲を800*480を指定しても画面全部のキャプチャが取れず、960*640の範囲を指定してやらないとダメということなのです。
いくら頑張ってもIS03だけうまく画面キャプれなくてもう何度も投げ出しそうになったけど、この事実に気づいてなんとかなった頑張ったよ。
ちなみに、作ったテクスチャ・・画像を貼り付けるのに使う関数のglDrawTexiOESも同じくビューポートをガン無視しやがる。これにもハマった。
同じく描画する関数のglDrawArraysはちゃんとビューポート適用されてるのにね。。
というわけで、今度こそようやくアプリがひと段落着いた!
やっとこさ本腰入れて次のアプリ製作に取り掛かれるよ。。