Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在glThread上运行长任务而不阻塞Android上的UI线程_Android_Multithreading_Opengl Es_Surfaceview - Fatal编程技术网

在glThread上运行长任务而不阻塞Android上的UI线程

在glThread上运行长任务而不阻塞Android上的UI线程,android,multithreading,opengl-es,surfaceview,Android,Multithreading,Opengl Es,Surfaceview,在我的GLSurfaceView 这些必须在OpenGL线程上完成 然而,这会在初始化期间挂起我的主线程 这是我的密码: @Override protected void onStart() { super.onStart(); FrameLayout renderingLayout = (FrameLayout) findViewById(R.id.movie_rendering_layout); if (renderingLayout != null &&am

在我的
GLSurfaceView

这些必须在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);
        /* [...] */
    }
@覆盖
受保护的void onStart(){
super.onStart();
FrameLayout renderingLayout=(FrameLayout)findViewById(R.id.movie\u rendering\u layout);
if(renderingLayout!=null&&mGLView==null){
mGLView=newmyglsurfaceview(getApplicationContext());
/** [..] **/
renderingLayout.addView(mGLView,params);
}
}
/*---------------OPENGL相关---------------*/
受保护类MyGLSurfaceView扩展了GLSurfaceView{
私人终审法院;
公共MyGLSurfaceView(上下文){
超级(上下文);
//创建OpenGL ES 1.0上下文
setEGLContextClientVersion(1);
mrender=新的MyGLRenderer();
//设置用于在GLSURFACHEVIEW上绘制的渲染器
setRenderer(mRenderer);
}
}
受保护的类MyGLRenderer实现了GLSurfaceView.Renderer{
私有整数mWidth,mHeight=0;
私有布尔值isFinished=false;
已创建Surface上的公共void(GL10未使用,EGLConfig配置){
//设置背景框颜色
GLES10.glClearColor(0.0f,0.0f,0.0f,0.0f);
init(mMovieIndex,AssetsUtils.getBinPath(getApplicationContext());//我找到了一个解决方案:

问题是不能在
onDrawFrame
onSurfaceCreated
中阻塞,因为它们是由主线程同步调用的

要禁用调用,我在曲面构造函数中使用:

setRenderMode(RENDERMODE_WHEN_DIRTY);
这样,一旦视图解决,对
onDrawFrame
的调用将停止

我从

public void onWindowFocusChanged(boolean hasFocus) 
小心,它可能会被调用两次。如果有人有更好的建议,我很乐意听(摘自)

我也推翻了

@Override
public boolean isDirty()
   return false;
}

不要忘记使用
queueEvent
在GLThread上运行代码

通常的答案是在同一共享组中创建两个EGL上下文,每个上下文绑定到一个单独的线程

渲染循环中的主线程对屏幕进行任何渲染,这在资源加载过程中通常是“无聊的”——即加载图形、进度条等

第二个线程加载背景中的任何批量资源,例如加载纹理文件、模型网格等并上载它们

加载完成后,主线程可以使用辅助异步加载线程加载的所有数据资源