« ルフィ仮装のカーネルさん | トップページ | 『カルピス&よくばり果実』だぁ~! »

2011年9月14日 (水)

『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分

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 『GALAXY Tab』は、かなり癖があるようだ…:

« ルフィ仮装のカーネルさん | トップページ | 『カルピス&よくばり果実』だぁ~! »