안드로이드 개발 질문/답변
(글 수 45,052)
opengl을 사용하는 프로그램을 짜고 있습니다.
로딩화면을 만들려고 하는데
GLSurfaceView가 화면에 표시될때 한 5초간 검은색화면이 계속나타나네요.
다음은 LOGCAT을 이용해서 걸리는 시간을 본것 입니다.
03-07 02:32:55.943: INFO/Log(8277): onCreate called
03-07 02:32:56.213: INFO/Log(8277): after GLWorld - 274
03-07 02:32:56.213: INFO/Log(8277): after GLRenderer - 275
03-07 02:32:56.213: INFO/Log(8277): after setting Pref - 275
03-07 02:32:56.213: INFO/Log(8277): after game - 275
03-07 02:32:56.213: INFO/Log(8277): after mGLView - 278
03-07 02:32:56.233: INFO/Log(8277): after addContentView - 290
03-07 02:32:56.233: INFO/Log(8277): after mGameThread - 293
03-07 02:32:56.433: INFO/Log(8277): after setSearchModule - 495
03-07 02:32:56.563: INFO/Log(8277): onSurfaceCreated called - 625
03-07 02:32:56.563: INFO/Log(8277): after setting fog - 626
03-07 02:32:56.943: INFO/Log(8277): before load building texture - 1002
03-07 02:32:59.603: INFO/Log(8277): after load building texture - 3663
03-07 02:32:59.643: INFO/Log(8277): onSurfaceCreated finishde - 3702
03-07 02:32:59.643: INFO/Log(8277): onSurfaceChanged called - 3702
03-07 02:32:59.643: INFO/Log(8277): onSurfaceChanged finished - 3703
03-07 02:32:59.643: INFO/Log(8277): onDrawFrame called - 3708
03-07 02:32:59.653: INFO/Log(8277): before draw world - 3710
03-07 02:33:01.413: INFO/Log(8277): after draw world - 5476
03-07 02:33:01.413: INFO/Log(8277): onDrawFrame finished - 5476
보시다 시피 최종적으로 첫프레임이 표시될때까지 약 5.4초가 소비되네요.
구글링으로 찾아낸 해결책들은
1.framelayout을 이용해 GLSurfaceView위에 로딩화면 View를 겹쳐놓고
로딩이 끝나면 visibility를 변경하는 방법
2. flipper를 이용해서 로딩이 끝나면 화면전환하는방법
이런것들이 있더라구요.
그런데 이방식들로 해보니, 일단 GLSurfaceView가 다른 View로 가려지면
onSurfaeCreated(), onSurfaceChanged(), onDrawFrame()메소드들이 아얘호출이 안되더라구요.
그러니까 로딩작업이 아애 실행이 안되버려서
화면 전환이 안됩니다.
혹시나 handler를 이용해서 한 5초뒤 강제로 view를 전환시키면 어떻게 될까? 생각이들어서
해봤는데, 화면 전환되고 나서부터 로딩이 시작되더라구요. (물론 로딩시 화면은 검게 나오구요)
----------------------------------------------------------------------------------------------------
본문이 길어서 죄송합니다. 혹시 opengl사용하시는분들중에 로딩화면 어떻게 구현하셨는지 좀 물어봐도 될까요?
제 코드는 대략적으로 다음과 같습니다.
-------------------------------------------------------------------------------------------------------
public void onCreate(Bundle savedInstanceState) {
mGLView = new GLView(getApplication(), mGLRenderer, game); //GLSurfaceView만듬
setContentView(mGLView);
}
public class GLRenderer implements GLSurfaceView.Renderer {
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
//부하가 가장 많이 걸리는 부분 텍스터 로딩하는데 약 3초정도 걸림
//최종적으로 GLUtils.texImage2D()호출
groundTexture = loadBitmap(mContext, gl, mGroundTextureRes, mTextureMode);
skylineTexture = loadBitmap(mContext, gl, mSkylineTextureRes, mTextureMode);
skyboxTexture = loadBitmap(mContext, gl, mSkyboxTextureRes, mTextureMode);
campusTexture = loadBitmap(mContext, gl, mCampusTextureRes, mTextureMode);
for(int i=0; i < mBuildingTextureRes.length; i++) {
buildingTexture[i] = loadBitmap(mContext, gl, mBuildingTextureRes[i], mTextureMode);
}
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
}
@Override
public void onDrawFrame(GL10 gl) {
}
}
---------------------------------------------------------------------------------------------
지푸라기라도 잡는 심정으로 올립니다.
뭐 안되면 별수 없구요.
2011.03.07 18:42:43
해결 했습니다. 구글링을 좀더해보니 답이 나오네요.
http://www.anddev.org/android-2d-3d-graphics-opengl-tutorials-f2/solved-help-with-splash-loading-screen-t13683.html
여기 질문답변 내용이 제 상황과 딱 맞아떨어지네요.
어떤식으로 구현했냐면 로딩화면부터 한프레임출력하고, 그뒤에 텍스쳐를 로딩하게 했습니다.
코드는 다음과 같습니다.
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
surfaceCreated = true;
showLoading = true;
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
surfaceChanged = true;
}
@Override
public void onDrawFrame(GL10 gl) {
if(surfaceCreated) {
if(showLoading) {
} else {
}
}
if(surfaceChanged) {
if(showLoading) {
} else {
}
if(showLoading) {
} else {
}
}
보다싶이 onSurfaceCreate와 onSurfaceChanged 코드를 다 onDrawFrame으로 옮겼고
onDrawFrame은 첫루프때 로딩화면출력하고 그 다음 프레임부터 로딩및 본화면을 출력하도록 했습니다.



