2016-10-04 32 views
4

我有過很多初始化的運行阻塞UI線程上運行glThread長期的任務之前,我可以在我的GLSurfaceView沒有在Android

論文渲染任何必須在OpenGL的線程上完成的。

然而這掛起了我的主線程初始化的持續時間。

這裏是我的代碼:

@Override 
protected void onStart() { 
    super.onStart(); 
    FrameLayout renderingLayout = (FrameLayout) findViewById(R.id.movie_rendering_layout); 
    if (renderingLayout != null && mGLView == null) { 
     mGLView = new MyGLSurfaceView(getApplicationContext()); 
     /** [..] **/ 
     renderingLayout.addView(mGLView, params); 
    } 
} 

/*--------------- OPENGL RELATED ---------------*/ 

protected class MyGLSurfaceView extends GLSurfaceView { 

    private final MyGLRenderer mRenderer; 

    public MyGLSurfaceView(Context context) { 
     super(context); 
     // Create an OpenGL ES 1.0 context 
     setEGLContextClientVersion(1); 
     mRenderer = new MyGLRenderer(); 
     // Set the Renderer for drawing on the GLSurfaceView 
     setRenderer(mRenderer); 
    } 
} 


protected class MyGLRenderer implements GLSurfaceView.Renderer { 
    private int mWidth, mHeight = 0; 
    private boolean isFinished = false; 


    public void onSurfaceCreated(GL10 unused, EGLConfig config) { 
     // Set the background frame color 
     GLES10.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
     init(mMovieIndex, AssetsUtils.getBinPath(getApplicationContext())); // <----- THIS takes long time 

    } 

    public void onDrawFrame(GL10 pGL10) { 

     GLES10.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
     GLES10.glClear(GLES10.GL_COLOR_BUFFER_BIT); 
     /* [...] */ 
    } 

回答

0

運行代碼通常的答案是在同一個共享組中創建兩個EGL上下文,每個綁定到一個單獨的線程。

在渲染循環的主線程沒有任何渲染到屏幕,資源加載在此期間,通常是一些「無聊」 - 即裝載圖形,進度條等

第二個線程加載任何大宗資源在後臺,例如加載紋理文件,模型網格等,並上傳它們。

加載完成後,主線程可以使用由輔助異步加載線程加載的所有數據資源。

2

我找到了一個解決方案:

的問題是,你不能在或onSurfaceCreated阻止,因爲它們是由主線程同步調用。

要禁用電話,我在面構造用來:

setRenderMode(RENDERMODE_WHEN_DIRTY); 

這樣,一旦視圖結算到呼叫將停止。

我從

public void onWindowFocusChanged(boolean hasFocus) 

進行初始化小心它可以被稱爲兩次。如果任何人有更好的建議我會很樂意聽它(從How to make a callback after the view is completely rendered?拍攝)

我也overrided

@Override 
public boolean isDirty() 
    return false; 
} 

而且不要忘了使用queueEvent對GLThread