Webを参考にDDMSの割り当てトラッカーを使って、自分の書いたクラスの毎ループ確保されるローカル変数をなくして、微改善はしたのですが
それでも2~5秒程度の間隔でGCが発生して、ときどき(だいたい10~15秒に一回程度)カクついてしまいます。
割り当てトラッカーを見ているとどうも、描画用メソッドでメモリが繰り返し確保されており、多分そこが原因と思うのですが、問題の根本も対処法も検討がつきません。
アドバイスの程お願いします。
↓描画用のメソッド トラッカーで怪しそうだったのはコメントに矢印のある部分です
public void draw( GL10 gl, int id ){
gl.glBindTexture(GL10.GL_TEXTURE_2D, texMap.get(id));//// ←
//-------------------------------------------------------------
//テクスチャ座標の位置とデータを指定
// 位置情報 uvは左上が(0,0)
// ※本当は左下が(0,0)だが画像が上下ひっくり返る為、左上が(0,0)と考える
bbuv = ByteBuffer.allocateDirect(uv.length * 4);//// ←
bbuv.order(ByteOrder.nativeOrder());
fbuv = bbuv.asFloatBuffer();//// ←
fbuv.put(uv);//// ←
fbuv.position(0);
// テクスチャバッファの成分を有効にする。
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
// 1.要素数uv 2つ
// 2.Bufferが格納されている型の指定
// 3.第一引数を読み込んだ後、読み込みをスキップする数
// 4.値が格納されているバッファの指定
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, fbuv);
//-------------------------------------------------------------
// ! 位置情報
// float positions[] = {
// pos_x ,pos_y ,0,
// pos_x ,pos_y+(height*scale) ,0,
// pos_x+(width*scale) ,pos_y ,0,
// pos_x+(width*scale) ,pos_y+(height*scale) ,0
// };
//↓GC対策として
positions[0] = pos_x; positions[1] = pos_y; positions[2] = 0;
positions[3] = pos_x; positions[4] = pos_y+(height*scale); positions[5] = 0;
positions[6] = pos_x+(width*scale); positions[7] = pos_y; positions[8] = 0;
positions[9] = pos_x+(width*scale); positions[10] = pos_y+(height*scale); positions[11] = 0;
// ! OpenGLはビッグエンディアンではなく、CPUごとの
//ネイティブエンディアンで数値を伝える必要がある。
// ! そのためJavaヒープを直接的には扱えず、
//java.nio配下のクラスへ一度値を格納する必要がある。
bb = ByteBuffer.allocateDirect(positions.length * 4);//// ←
bb.order(ByteOrder.nativeOrder());
fb = bb.asFloatBuffer();//// ←
fb.put(positions);
fb.position(0);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fb);
// 1.モード(GL_TRIANGLE_STRIP:連続した三角形)
// 2.何番目の頂点から描画を行なうかを指定
// 3.いくつの頂点を利用するかを指定
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
// gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}