スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
新しい記事を書く事で広告が消せます。
Androidアプリ開発(OpenGL描画導入編)
こんばんは、フィブです。
今まで作成してたプログラムですが、問題発生。
フリック処理が激重い!
今まで順調だった開発が背景スクロール実装した途端FPSが60→30台に。
フリック処理中は20台にまで落ち込むことがありハッキリ言ってとても使い物にならない。
速度を求めていろいろ調べたところやっぱりOpenGLでの描画が早いらしい。
というわけでOpenGLを用いた実装に変更していきました。
下記サイトを参考にしつつサーフェスが表示できるまで変更していきます
http://www.saturn.dti.ne.jp/~npaka/android/Graphics2DEx/index.html
いらないところは削りつつ、欲しいところはもらいつつソースを読んでいきましょう。
かなり苦労しました。
昔DirectXを学習したとき3Dの概念があまり理解できず一度投げたんですよ。
まさかこんなところで基礎知識不足というツケが回ってくるとは思いませんでした・・・。
以下よりあってるか間違ってるかわからないですが、簡単メモ書き。
※多分こうだろうってことがばっかり書いてるので全然違うかもしれません。
・OpenGLで描画するにはまずEGLというオブジェクトが必要(EGL10クラスとか)
・EGLはコンテキスト、コンフィグ、サーフェスなどをガリガリ設定して登録しておく
・OpenGLで実際に描画するにはGLオブジェクトが必要。(GL10クラスとか)くら
→これは言うなればOpenGLで描画する際のCanvasクラスみたいなもんだと思っとく
Canvas.drawBitmapで描画するように、GL.draw_textureで実際描画するし。
・GLクラスはビューポート変換、プロジェクション変換、モデリング変換、他ブレンド設定とかUV設定とかやっとく。
・テクスチャは2のべき乗のサイズに修正する。
バイトバッファに画像情報をしこしこ格納していく(単純に画像のRGBA情報をバイト配列に詰めなおしてる)
glGenTexturesで、テクスチャに管理番号を割り当てる。(GL側が勝手に管理する番号がもらえる)
※各テクスチャを張るときはこの管理番号で判別するため自分のオブジェクトに生成した番号を保存しておこう
glBindTextureで、今つけた管理番号のテクスチャを使用しますよって連絡する
glTexImage2Dで、画像情報が入ったバイトバッファなどを渡し「今の管理番号はこの画像と関連付けるから!」って命令する
ここまでやってようやくテクスチャ一枚が使えるようになる。
・メインループ内では、今の管理番号をGLオブジェクトに渡して描画する。
・全部終わったら、EGLのeglSwapBuffersで画面に表示する!
(あたしはここでハマりました。 これやらなかったからずっと画面真っ黒だった・・・)
以上。疲れた。。。
えーっと簡単にまとめると
-------------------------------------------------------
プログラムの開始
↓
EGL作成・設定
↓
GL作成・設定
↓
テクスチャ読み込みとかする
↓
メインループ
↓
GLを使って描画
↓
EGLで画面を更新!
↓
メインループに戻る・・・
-------------------------------------------------------
この手順を意識してやれば多分いけます・・・。
さて・・・色々疑問が浮かぶこともありましたが。
Q.INTバッファにカラー情報格納ってやってるけどこのINTバッファの処理の必要性がイマイチわからない。
テクスチャ読む際は画像情報を自前でバッファ配列に突っ込まなきゃいけないの?
なんかOpenGL標準読み込みメソッドとかそういうのないのかな・・・
予想としては2つ。
①OpenGLにはそういう機能がないからこっちがやらなきゃいけない。
②こうしたほうが速い。
バイトバッファでなんかやったほうが速いと思っとこう・・・。
Q.なんで画像読み込み時に画像作りなおしてるの?
A.これはOpenGLが画像のサイズが2のべき乗のものしか扱えないから。
サイズがまちまちだったりするとこまるから2のべき乗の数のサイズで画像を作りなおしてるのね。
Q.テクスチャ描画する際に、引数Yがマイナスされてるのなんで?
A.これ、OpenGLの3D座標の問題で。OpenGLはY座標の値が上に伸びるから。
画面は
・→X
↓
Y
だけどOpenGLは
Y
↑
・→X
って感じで、画面とY値の方向が逆なの。
以上、3Dに明るい人は「当たり前だろ!」とか言い出しそうな話。
あんまり詳しくない人ようにあえて書きましたが、真偽は定かでは・・。
今まで作成してたプログラムですが、問題発生。
フリック処理が激重い!
今まで順調だった開発が背景スクロール実装した途端FPSが60→30台に。
フリック処理中は20台にまで落ち込むことがありハッキリ言ってとても使い物にならない。
速度を求めていろいろ調べたところやっぱりOpenGLでの描画が早いらしい。
というわけでOpenGLを用いた実装に変更していきました。
下記サイトを参考にしつつサーフェスが表示できるまで変更していきます
http://www.saturn.dti.ne.jp/~npaka/android/Graphics2DEx/index.html
いらないところは削りつつ、欲しいところはもらいつつソースを読んでいきましょう。
かなり苦労しました。
昔DirectXを学習したとき3Dの概念があまり理解できず一度投げたんですよ。
まさかこんなところで基礎知識不足というツケが回ってくるとは思いませんでした・・・。
以下よりあってるか間違ってるかわからないですが、簡単メモ書き。
※多分こうだろうってことがばっかり書いてるので全然違うかもしれません。
・OpenGLで描画するにはまずEGLというオブジェクトが必要(EGL10クラスとか)
・EGLはコンテキスト、コンフィグ、サーフェスなどをガリガリ設定して登録しておく
・OpenGLで実際に描画するにはGLオブジェクトが必要。(GL10クラスとか)くら
→これは言うなればOpenGLで描画する際のCanvasクラスみたいなもんだと思っとく
Canvas.drawBitmapで描画するように、GL.draw_textureで実際描画するし。
・GLクラスはビューポート変換、プロジェクション変換、モデリング変換、他ブレンド設定とかUV設定とかやっとく。
・テクスチャは2のべき乗のサイズに修正する。
バイトバッファに画像情報をしこしこ格納していく(単純に画像のRGBA情報をバイト配列に詰めなおしてる)
glGenTexturesで、テクスチャに管理番号を割り当てる。(GL側が勝手に管理する番号がもらえる)
※各テクスチャを張るときはこの管理番号で判別するため自分のオブジェクトに生成した番号を保存しておこう
glBindTextureで、今つけた管理番号のテクスチャを使用しますよって連絡する
glTexImage2Dで、画像情報が入ったバイトバッファなどを渡し「今の管理番号はこの画像と関連付けるから!」って命令する
ここまでやってようやくテクスチャ一枚が使えるようになる。
・メインループ内では、今の管理番号をGLオブジェクトに渡して描画する。
・全部終わったら、EGLのeglSwapBuffersで画面に表示する!
(あたしはここでハマりました。 これやらなかったからずっと画面真っ黒だった・・・)
以上。疲れた。。。
えーっと簡単にまとめると
-------------------------------------------------------
プログラムの開始
↓
EGL作成・設定
↓
GL作成・設定
↓
テクスチャ読み込みとかする
↓
メインループ
↓
GLを使って描画
↓
EGLで画面を更新!
↓
メインループに戻る・・・
-------------------------------------------------------
この手順を意識してやれば多分いけます・・・。
さて・・・色々疑問が浮かぶこともありましたが。
Q.INTバッファにカラー情報格納ってやってるけどこのINTバッファの処理の必要性がイマイチわからない。
テクスチャ読む際は画像情報を自前でバッファ配列に突っ込まなきゃいけないの?
なんかOpenGL標準読み込みメソッドとかそういうのないのかな・・・
予想としては2つ。
①OpenGLにはそういう機能がないからこっちがやらなきゃいけない。
②こうしたほうが速い。
バイトバッファでなんかやったほうが速いと思っとこう・・・。
Q.なんで画像読み込み時に画像作りなおしてるの?
A.これはOpenGLが画像のサイズが2のべき乗のものしか扱えないから。
サイズがまちまちだったりするとこまるから2のべき乗の数のサイズで画像を作りなおしてるのね。
Q.テクスチャ描画する際に、引数Yがマイナスされてるのなんで?
A.これ、OpenGLの3D座標の問題で。OpenGLはY座標の値が上に伸びるから。
画面は
・→X
↓
Y
だけどOpenGLは
Y
↑
・→X
って感じで、画面とY値の方向が逆なの。
以上、3Dに明るい人は「当たり前だろ!」とか言い出しそうな話。
あんまり詳しくない人ようにあえて書きましたが、真偽は定かでは・・。
コメント
コメントの投稿