본문 바로가기

GRAPHICS/OpenGL ES

[OPENGL ES] FloatBuffer allocation 관리를 통한 그래픽 최적화

앱 메모리 검사를 하면서 쌓이는 ByteBufferAsFloatBuffer, ByteBufferAsShortBuffer 등 때문에 의아해 했었고,


이것들이 OpenGL draw에 필수적인지, 항상 allocation 해주어야 하는지 서치와 실험을 계속했다.


결과적으로 ByteBuffer를 FloatBuffer에 nativeOrder로 간접적으로 할당해주어야 하는 방법은 일반적인데,


이를 한 픽셀을 draw 할 때마다 해 줄 필요는 없는 것이었고, 최초 draw를 시작하는 onSurfaceCreated 에서 한번


수행해주는 것으로 드로잉에 문제가 없음을 확인할 수 있었다.


다만, memory allocation은 한번으로 족하지만 이를 float 배열로 받아 put(values) 하고 position(0)를 해주는 것은


그대로 해 주어야만 한다. 그래픽 draw에 필수적이기 때문이다.




아래는 수정 이전과 이후의 스크린샷인데, 기존에는 약7만회에 달하는 할당과 GC를 반복하면서 메모리가 요동치는 모습을 볼 수 있다.



수정 이후에는 해당 allocation이 사라지면서 메모리가 그만큼 기하급수적으로 alloc 되는 일도 없어졌고, GC의 빈도도 이전보다 줄어들거나 부담이 적어진 것으로


보여진다. 



추가로 검사하고 조심해야 할 건 수정 이후의 장기적인 테스트와 아직 여전히 존재하는 메모리 alloc과 GC가 어떤 영향으로 인해 발생하는지


확인하고 수정해나가야만 한다는 것이다.


그동안 멀리까지 잘 왔다!