안드로이드 스터디 모임 - OpenGL
(글 수 62)
원문입니다 : http://berabue.tistory.com/70
쓰레드를 만들고 이미지를 움직여보겠습니다.
자바소스에서 GameThread.java를 만들겠습니다.
package pe.berabue.opengl; import android.content.Context; public class GameThread extends Thread { private boolean isRun; public GameThread(Context context) { isRun = true; } public synchronized void run() { while(isRun) { try { MainActivity.mGLView.requestRender(); Thread.sleep(10); } catch (InterruptedException e1) { e1.printStackTrace(); } } } } }
딱 한 부분만 중요합니다.
MainActivity.mGLView.requestRender();
requestRender()는 onDrawFrame()함수를 호출해줍니다. 쓰레드가 동작하는동안 지속적으로 onDrawFrame을 호출하겠지요.
MainActivity.java에서 쓰레드를 동작시키겠습니다.
package pe.berabue.opengl; import android.app.Activity; import android.opengl.GLSurfaceView; import android.os.Bundle; public class MainActivity extends Activity { public static GLSurfaceView mGLView; public static GameThread mThread; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGLView = new GLView(getApplicationContext()); mThread = new GameThread(getApplicationContext()); setContentView(mGLView); mThread.start(); } static { System.loadLibrary("berabueLib"); } }
public static GLSurfaceView mGLView;
private -> public static으로 변경하였습니다. 쓰레드에서 mGLView 객체에 접근하기위해서.
쓰레드 객체를 생성하고 쓰레드를 시작합니다~!
GLGameRenderer.c 에서 이전에 띄운 이미지를 움직여 보도록하겠습니다.
void updateGameLoop() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); updatePanda(); drawPanda(); } void updatePanda() { g_nY = ( g_nY < 0 ) ? 800 - g_nPandaHeight : g_nY-5; }
updateGameLoop()안에 updatePanda()를 추가시키고 좌표가 변화되는 코드를 입력합니다.
빌드 후 실행을해보면~!
팬더가 지속적으로 올라가는 화면이 출력됩니다!
C 레벨에서 쓰레드를 호출한게 아니라 Java 레벨에서 서브스레드를 만들어서 호출한 케이스군요..
이번 예제에서 의도하는게 어떤건지 이해가 가지 않네요..ㅠㅠ
사용용도가 화면을 갱신하기 위해서? ...
일단 NDK 활용이 극대화 되면 자바 스레드는 UI 갱신에 대해서는 사용하지 않는게 좋으며
Native에서는 쓰레드 상황에서 JNI호출을 자제 해 주는게 좋습니다.
위에 경우에 페이스북을 Java 라이브러리를 사용해서 연동하였고
Native단에서 C -> Java를 호출하여 페이스북 메서드를 사용 할때라면 문제가 종종 발생됩니다.
Java 함수는 핸들러 처리를 해줘야 하고
Native 에서는 Thread Safe상황을 항상체크해야 하는 상황이 발생되어
AttachThread 를 Check 해줘야 합니다
AttachThread 를 Check하기 위해서 JNI구조를 살짝 뜯어 고쳐야 하는 경우도
뱔생됩니다.
JNI사용시에는 Static 활용하는게 여러모로 편리합니다.
늘 그렇겠지만 쓰레드는 꼭 필요한 상황에 써야 하는게 맞는거 같아요..
게다가 JNI까지 맞물려 있다면 더더욱 신경써야 겠더라고요..
가뜨기나 디버깅 그지 같은데 ..ㅠㅠ
암튼 태클 거는건 아니랍니다. ^^