본문 바로가기

나의 플랫폼/안드로이드

[Android] Opengl 텍스쳐 변경 시!!!

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
 제가 하루 동안 갑자기 발생한 Memory over flow 때문에...
원래 제출 해야하는 날보다 하루 미루게 되었던 대 사건의 원인을 적어볼까 합니다. 

- 테스트 폰 : HTC 디자이어 HD, Sky Vega X
- 문제:
  LiveWallpaper의 설정을 여러 번 바꾼 후에, 갑자기 핸드폰이 멈춰버리는 대 사건이!-0- 

- 원인:
  거의 5시간을 걸쳐 디버깅 하고, 구글리을 해서 알아낸 결과!
  heap memory가 사라지지 않고, 계속 쌓이는 것이었습니다.

  처음 Bitmap의 초기화를 잘 못했나 해서 받아들인 Bitmap에 전부 초기화를 했습니다.

 [Bitmap 초기화 방법]
gl.glGenTextures(textures.length , textures, 0);

gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[i]);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
 
bitmap.recycle();
bitmap = null;
 => 위와 같이 텍스처에 설정을 해 놓으면 다시 Bitmap을 쓸 일이 없기 때문에 초기화를 꼭! 해주세요.


 하지만!!
heap momory는 줄어들지 않고 계속 차지 하고 있는 것입니다.(참고로, 전 이미 모든 Bitmap에 recycle를 해준 상태였음)
그래서 Texture에 문제다! 라고 생각한 저는 바로 구글링을 다시 시작했습니다.
찾아보면.. 거의 Bitmap에 대한 이야기가 대부분 이더군요.

근데!! 문제가 된 것은 단순합니다.

텍스쳐를 처음 설정할 때(추가할 때)는  gl.glGenTextures 로써 포인터를 지정하지만,
텍스쳐를 다른 Bitmap으로 수정할 때는 gl.glGenTextures를 사용하면 안됩니다.!!!!

 
 정말 중요한 부분 입니다. 저 함수를 지정하면 별도의 텍스쳐 주소를 지정해주므로,
 다시 프로그램이 종료가 되지 않은 상태에서는 계속 쌓이게 되어 버립니다.

꼭 텍스쳐를 변경할 부분이 있으시면
load함수와 set함수 2개를 만들어 두세요.

public void loadGLTexture(GL10 gl, Bitmap bitmap) {
if(bitmap == null ){
Log.e("DEBUG","loadGLTexture : Bitmap is null!!!!!!!!!!");
return;
}

//텍스처 포인터 설정
gl.glGenTextures(textures.length , textures, 0);

gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[index]);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

bitmap.recycle();
bitmap[i] = null; 

}

public void setGLTexture(GL10 gl, Bitmap bitmap) {
if(bitmap == null ){
Log.e("DEBUG","setGLTexture : Bitmap is null!!!!!!!!!!");
return;
}
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[index]);
          gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap[i], 0);

bitmap.recycle();
bitmap[i] = null;




위 두 함수를 참고하세요^^