2016-10-04 4 views
4

я должен работать через много инициализации, прежде чем я могу вынести что-нибудь в моих GLSurfaceViewВыполнить длинную задачу по glThread без блокировки UI нити на 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?)

Я также перекрытой

@Override 
public boolean isDirty() 
    return false; 
} 

И не забывайте использовать queueEvent для запуска кода на GLThread