タグ別アーカイブ: OpenGL ES

AndroidのOpenGL ESでビットマップが真っ黒になる。

現在、AndroidでOpenGL ESを使って描画処理を書いているのですが、深刻な問題に直面していて原因がつかめずにいます。

GLSurfaceViewクラスのonDrawFrameで、Bitmapを作ってCanvasで描画し、それをテクスチャにロードしてポリゴンに貼っているのですが、しばらくするとビットマップが真っ黒になってしまい、まともに表示されなくなります。画面全体が真っ黒になるのではなく、新しく作ったビットマップが真っ黒になるようです。

最初、テクスチャの枯渇を疑ったのですが、不要になったテクスチャは都度削除していますので、高々数百程度しかテクスチャは同時に使っていません。それに、仮にテクスチャが枯渇したのであれば、地のポリゴンの色がそのまま現れるはずですが、必ず真っ黒になるのです。

ビットマップリソースの枯渇も疑いました。この現象に陥ると、自分が作ったアプリだけでなく、システムのアイコンまで真っ黒になることがあるからです。Bitmapはテクスチャをロードしたあとに都度recycleしていますが、実際にリソースが解放されるのはGCのタイミングのようなので、これが原因の可能性はある程度考えられます。

Androidのバージョンは3.1および3.2なのですが、どうもはっきり「これだ!」という原因がつかめません。一応、ビットマップの生成回数を減らすために、極力同じものを使い回すようにして対策しました。ただ、それだと問題が顕在化するまでの時間を引き延ばしただけで、状況次第では再発する危険性が残っています。

ビットマップのGCの問題であれば、時間を引き延ばすだけでも十分な効果が見込める可能性はあります。ただ、はっきりそうだとわからないのが気持ち悪いところです。

Android アプリに挑戦

私は Java のこともあまり知らなければ Android についても素人と変わらなかったので、これまで Android のアプリ開発の仕事があったも別の担当者にまかせてきました。

ところが最近になって、そうもいってられない状況になってきました。そこで、いよいよ重い腰を上げて Android のアプリ開発に挑戦することになりました。といっても、ほとんどが OpenGL ES を使った開発になるので、典型的な Android アプリとはかなり異なるのですが、これが何とかなればあとは応用が効くはずです。

不慣れな Java についてもある程度知識を深めるとともに、いろいろな実験を行いながら、極めていけたらと考えています。やがては、Android のお仕事も安心して自分で担当できるようになることでしょう。