『GALAXY Tab』は、かなり癖があるようだ…
以前から動いていたアプリケーションが
『GALAXY Tab』だと動かない…。(T_T)
正しくは、ポリゴンが真っ白に表示される…。
他の『Android』だと表示されているのになぁ~。
しかも、エラーで停止する訳でなくそのまま動いている…。(汗)
これは、『GALAXY Tab』の不具合なのだろうか?
メジャー端末のはずなんだけどなぁ~。
何が悪いのやら…(T_T)
『GALAXY Tab』の『OpenGL』は、何かが違うのだろうか?
…
…
…
嘆いていても、解決しない。
最初は、ソースを見直して
問題点を見つけ出そうとしたが
元々が正常に動作していないので
問題点を見つけるのは、困難…。
…
…
…
じゃあ、正常に動くものを骨だけにして
比較して問題点を炙り出してみよう!
お!こんな所に
『OpenGL で作る Android SDK ゲームプログラミング』
が、あるじゃないか!
載っているサンプルを動かしてみると正常に動作する。
よし!これを骨だけにして比較してみよう!
って訳で…
サクサクと音楽処理とか敵制御とかを
切っていきコアの部分だけにしていく。
で、骨だけにした所で問題アプリに移植。
表示処理中にサクッと新しい表示処理を噛ませてみた。
…
…
…
駄目だった…。
…
…
…
テクスチャーを追加処理の方で読み込んでないからか?
テクスチャーを読み込んで表示してみる。
…
…
…
表示した!
…
…
…
どうやら、初期化関連の設定は、正しいらしい。
表示部分の処理で問題があるようだ…。
ふと、テクスチャーのみ新しい処理のものに替えてみた。
そしたら、表示されたぁ~!?
…
…
…
これは、何!?
…
つまり、テクスチャーが正しく読み込まれていない?
と、言う事なのか!?
で、読み込みのどの部分が問題かと突き詰めてみると…
ここだった…
bitmap = BitmapFactory.decodeResource(context.getResources(), index);
リソースから画像を読み込む所。
正常に動作する方の処理は、こうなっていた。
// リソースの自動リサイズをしない
// アルファー付き32ビット画像として読み込む
private static final BitmapFactory.Options options = new BitmapFactory.Options();
static {
options.inScaled = false;
options.inPreferredConfig = Config.ARGB_8888;
}
Bitmap loadTexture(Context context, int index) {
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), index, options);
return bitmap;
}
「options」の初期化の方法は、初めて見た。
これから利用しよう。
このように、読み込む所で、フォーマットを指定すると
きちんと表示される。
読み込んでいる画像は、アルファー付き32ビットPNGの
512x512ドットでなんだけどなぁ~。
何のフォーマットで読み込んでんだよ!
ちなみに「options」の設定は、
「Config.ARGB_4444」でも「Config.RGB_565」でも可。
…
何が悪いのか、さらに調べてみた。
「options」無しを「bitmap.getConfig();」調べてみる。
すると、「Config.RGB_565」だ。
でも「options」付きで「Config.RGB_565」を指定しても
きちんと表示される。
むむむむむ…
もう少し、詳しく調べてみると…
あれ?
あれれれれれ…?
「options」無しだと
RGB_565 <- bitmap.getConfig().name();
1536 <- bitmap.getRowBytes();
768 <- bitmap.getWidth();
768 <- bitmap.getHeight();
「options」有りだと
RGB_565 <- bitmap.getConfig().name();
1024 <- bitmap.getRowBytes();
512 <- bitmap.getWidth();
512 <- bitmap.getHeight();
あ!
ああ!
勝手にリサイズしている!
ガ━━(゚Д゚;)━━ン!
何、勝手しくさるんや!
ちなみに『GALAXY Tab』は、テクスチャーサイズが
2の階乗でないと正常に動作しない。
…
正常に動作しないの自業自得じゃん…。
誰だよ!
こんな馬鹿なことしくさるのは! (>_<)/
…
結構普通に使われている「options」無し。
『GALAXY Tab』で開発する人は、結構はまるのでは?
これで、苦しんでいる人に…
ああ、合唱!
俺にも、合唱…。
PS.
『OpenGL』に問題があるかと思ったら、
『BitmapFactory.decodeResource』に問題があるとは…
やられたぜ!
2011年9月12日追記----------------
こんな仕様とは、思わなかった!
なので今回の不具合を機会に調べてみた。
他のは、どうなのだろう?
「BitmapFactory.decodeResource(context.getResources(),index);」
で読み込んだものと
「BitmapFactory.decodeResource(context.getResources(),index),options;」
で読み込んだものと比較してみた。
※「options.inPreferredConfig = Config.RGB_565;」設定。
元画像 :type= ARGB_8888 / x= 512 / y= 512
XPERIA :type= RGB_565 / x= 768 / y= 768
GALAXY Tab:type= RGB_565 / x= 768 / y= 768
Ziio :type= RGB_565 / x= 512 / y= 512
な!
なにこれ!?
端末毎に実装が違うの!?
ガ━━(゚Д゚;)━━ン!
そう言う仕様!?
勝手に変更して良いのかそれ!?
…
この現象がどういう仕様なのか確認のため画像を
「XPERIA/GALAXY Tab」の「BitmapFactory.decodeResource」で読み込むと
「ARGB_8888 / 512 x 512」の画像が「RGB_565 / 768 x 768」の画像になる。
「ARGB_8888 / 256 x 256」の画像が「RGB_565 / 384 x 348」の画像になる。
「ARGB_8888 / 128 x 128」の画像が「RGB_565 / 192 x 192」の画像になる。
「ARGB_8888 / 64 x 64」の画像が「RGB_565 / 96 x 96」の画像になる。
「ARGB_8888 / 64 x 64」の画像が「RGB_565 / 96 x 96」の画像になる。
「ARGB_8888 / 32 x 32」の画像が「RGB_565 / 48 x 48」の画像になる。
「ARGB_8888 / 16 x 16」の画像が「RGB_565 / 24 x 24」の画像になる。
「ARGB_8888 / 8 x 8」の画像が「RGB_565 / 12 x 12」の画像になる。
理由は、不明ですが、1.5倍のサイズで読み込むようになっています。
これは、バグでは?
と思いたくなる仕様です。
全く理由が分かりません!
ちなみに「32bit 800x600dot」だと…
「ARGB_8888 / 1200 x 900」になる…
あれ?
タイプが違うぞ?
しかも「options」付きだとタイプが指定されず、
つまり「null」になり…
「bitmap.getConfig().name()」が跳ねる。
つまり、「RGB_565」だと正常に読み込めないので、
名称不明となっていると解釈するのが正しいのか?
「ARGB_8888/ARGB_4444」なら正常に動作します。
素直に読み込めよ!
と思う。
その点、「Ziio」は、「RGB_565」で読み込み指定をしていても
「ARGB_8888」に変えて正常に読み込みます。
…
…
…
どうやら以下の仕様らしい。
1.読み込んだ一片を1.5倍する。
※「Ziio」は、そのまま読み込む。
2.縦横の辺が同じなら「RGB_565」にする。
つまり透明は、消滅します!(笑)
3.縦横の辺が同じでないのなら「ARGB_8888」にする。
ただし、「options」で「RGB_565」が指定されていると、
「XPERIA/GALAXY Tab」では、タイプが無指定になる。
「Ziio」だと「ARGB_8888」に切り替わる。
何故このような仕様なのか、不明。
素直に読み込めよ!
って思います。
下っ端のプログラマーには、
とってもデカイ不具合のですが…
「偉い人には、それが分からんのですよ!」
なのだろうか…?
2011年9月18日追記----------------
何故こうなっているかが分かったのでこちらに書きました。
『何で1.5倍になるんだよ!?』と心で叫ぶ!
| 固定リンク
コメント
WAHM!さん
コメントどうも♪
私も悩みました…。
無事解決して何よりです♪
投稿: kouyou | 2012年8月 6日 (月) 23時10分
はじめまして!(^-^)
N-04Cではテクスチャーが正しく表示されるのにF-05D(他にも…)では黒くなるので悩んでいました。
参考にさせていただいて、F-05Dでもテクスチャーが正しく表示されるようになりました。
ありがとうございました!m(_ _)m
投稿: WAHM! | 2012年8月 6日 (月) 19時22分
kettさん
コメント有難うございます。
自分もえらく苦しんだので…。(笑)
お役に立てて、何より。
これからも、頑張ってください♪
投稿: kouyou | 2011年10月25日 (火) 20時57分
始めまして
GALAXY Tabでの描画でハマっていた所、
記事を拝見させて頂き
解決することが出来ました。
助かりました有難うございました
投稿: kett | 2011年10月25日 (火) 20時05分
こんばんわ(◎´∀`)ノ
ねこたさん
確かにiOSは、
一社だけなので、ここまで個体差(?)は
無いと思いますよ…。w
早速探し出しました!W8!
明日ダウンロードに挑戦しよう!w
投稿: kouyou | 2011年9月15日 (木) 01時19分
1.5倍になるというのがなんとも不思議。
機種ごとに異なる表示になってしまうと、アプリ検証にいっぱい実機が必要になってしまいますな…(^_^;
こうなるとiOSの方が行儀がよいのかも!
ただいまWindows8をDL中です…残り13時間40分 光に変えたいっす(T_T)
投稿: ねこた | 2011年9月15日 (木) 00時59分