안녕하세요 선후 입니다.^^
제가 OpenGL ES로 게임을 만들고 있는데요
프레임 체크를 해보니까
50
50
50
48
49
50
51
이렇게 계속 가다가
몇초 지나면
20
19
21
정도로 팍 떨어졌따가 다시
50
51
52
49
이렇게 올라가기글 계속 반복하네요 왜 이러죠 ㅠㅠ

혹시 백그라운드에서 돌고있는 서비스가 원인이 될 수는 없는지?
아니면 메인 스레드에 sleep을 사용하고 있나요? 사용한다면 몇 ms로 사용하는지,,
sleep이 정확히 인자로 넣은 시간만큼만 멈추는게 보장된게 아니라서 사용에 주의해야한다고는 알고있습니다.
50 에서 20 이면 차이가 꽤 큰건데..
가비지 콜렉션이 의심가는데 그게 아니라고 하시니.. 딱히 모르겠네요
혹시라도 onDraw 내에서 메모리 할당하는건 없는건가요?
전 미리 다 만들어 놓던지 해서 임시 객체도 전혀 없게끔 만듭니다.

계속 테스트해보니 GC때문이네요..........
GC Log가 바로바로 뜨는게 아니라 렉걸리는 타이밍과 달라서 햇갈렸었네요 ㅠㅠ
GC 이건 왜도는걸까요......
SoundPool을 쓰게 되면 필연적으로 GC가 돌게되나요?

redred님 말씀대로 저도 그때 그때 생성하는 변수는 별로 없거든요......
택스쳐 바인딩이 자주변경되면 GC가 돌게되는걸까요?
아니면
for(int i = 0; i < 10; i++){
할때 i 가 게임다보니 너무 많아서 GC가 돌게 되는걸까요
가만 두어도 렉이 생기시면 가만히 두지 마세요...는 아니구요;;
본문과 댓글을 읽어보니 Texture를 바인딩과 언바인딩을 계속 하신다고 하셨는데요.
보통 가만히 두는 상황에서 텍스쳐 바인딩이 빈번하게 일어날 필요가 있나요..?? 화면에 큰 변화가 없을것으로 생각이 되어서요.
어떤 게임을 만드시는 지는 모르지만 (제가 게임에는 문외한이어서..) 중복이 되는, 즉 자주 쓰이는 Texture는 한번 바인딩 된 객체를 유지하시면서 onDraw에 사용하시는 게 맞는 것 같습니다.
또 onDraw쪽에서 Memory관련 작업을 하시거나 복잡한 연산을 취하시면 프레임 저하는 당연한 결과가 될 수 밖에 없을텐데요. 이 부분도 한번 보시면 좋겠네요 ^^..onDraw에서는 정말 Draw만 하시는게 ^^..
구체적인 상황을 몰라서 아는대로 댓글 달아보네요. 조금이나마 도움이 되셨으면 ^^ 수고하세요.
오픈 지엘은 객체 기반이 아니라, 상태 기반이라서 텍스쳐를 한번 바인딩하면 그 뒤에서 그리는 모든 객체에 텍스쳐가 바인딩되게 됩니다.
즉, 객체마다 텍스쳐가 1:1 바인딩 방식이 아니라, 오픈지엘 상태에 텍스쳐를 바인딩해놓고 그 뒤에 그리는 객체는 모두 앞에서 바인딩 된 텍스쳐를 그리기 때문에 저렇게 언바인딩을 하시는 것 같네요.
성능 테스트는 안해봤지만 언바인딩이 문제라면 바인딩만하시고 텍스쳐를 안쓰는 도형을 그리실 때는 텍스쳐 disable시켜놓고 텍스쳐를 그려야할 떄 다시 enable 시키는게 나을 수도 있을 것 같다는 생각은 듭니다.

제가 하는게 제식대로 막하다보니
제대로 된건지 잘 모르겠는데
객체별로 자기 자신을 그리려면 자신의 이미지가 있는 텍스쳐를 바인드해야 하는데요
(텍스쳐의 최대크기가 1024 x 1024)라서 하나의 텍스쳐에 모든 게임 캐릭터를 넣을수는 없지 않나요?)
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); //여기서 textureId가 있다는것은 텍스쳐는 로드되어 져 있다는 뜻
(텍스쳐자체는 이미 로딩되어져 있구요)
하고
vertices.onDraw(GL10.GL_TRIANGLES, 0,~~
해서 그리쟎아요
이걸 무한 반복하는데 이것 때문에 GC가 발생하지는 않겠죠?
아니면 SoundPool로 효과음을 내서 그런것일까요?
제가 언바인드 한부분을 다시 확인해보니
텍스쳐를 gl.glDeleteTextures() 하지는 않구요
계속 윗부분으로만 써고 있어요
아... 제가 오해가 될만한 단어를 많이 사용했네요;; 전 언바인드 하신다고 하셔서 texture Load작업을 반복하시는 줄 알고 썼네요;
texture 버퍼에 Bitmap을 게속 로드하시는 줄 알았다는... ㅋ.
한번 Load된 Textrue를 선후님 말씀처럼 Bind해서 사용하는 건 큰 부하가 없는 것으로 알고 있습니다. 저도 그렇게 사용하고 있구요.
그리고 언급하신 BindTexture후에 Vertices들을 매 Draw시점마다 Draw해주어야 하는 것도 맞구요 ^^.
위슈님께서 말씀하신대로 객체를 매 Draw시점마다 생성한다거나 복잡한 연산의 문제가 아닌가 싶네요.. 혹은 기기의 문제일수도..
제가 오해하실 수 있는 글을 적어 되려 몇시간을 혼란스럽게 해드린 것 같아 죄송하네요 ^^;;
모쪼록 잘 해결하시길 바랍니다

그런데 이런것도 객체 생성인가요?
A라는 클래스가 있다면
있고
public void setData(A aa){
A a = aa;
a.num = 10;
}
이런식으로 메서드에서 A a 라는넘을 만들어서 들어오는 aa를 넣어서
a를 쓰게하고 있는데요.
이 때 a를 자꾸 선언하기 때문에 GC가 도는것일까요?

그리고 딜레이 체크를 해보니까
GC도 없는데
해당시점에
onUpdate()랑
onDraw() 둘다 느려지는것을 보니 그리는것 때문에 느려진것 같지는 않은것 같기도 하구요... 후.......
이 질문에 이리도 많은 사람들이 댓글을 달줄은 몰랐네요ㅎ
혹시 matrix 를 push, pop 이나 glRotate, glTrans 같은거 많이 하시나요?
OpenGL 파이프라인을 끊어버리기 때문에 되도록 안 하시는게 좋아요.
onDraw 의 모든 내용을 비우고 그냥 돌리면 frame 이 일정하게 잘 나오죠?
하나씩 넣고 빼면서 문제 코드를 추적해 보세요. 절반씩 나눠서 주석 처리로 테스트하면 금방 할거예요
헐 Canvas 사용할 때나 생기는 전설의 랙이 어째서 OpenGL에....
이해가 되질 않네요...ㅠㅠ
제 세미나에서 맨 처음 가르치는 것이
"엔진 개발이 목적이 아니라면 엔진이나 OpenGL에 대해 깊게 공부하려고 하지마세요."인데
딱 그걸 하고 계시네요. ㅋ