2011-04-07 9 views
5

Intento inicializar GLES con EGL (porque quiero dibujar desde el hilo principal en lugar de usar un Renderer y dibujar desde adentro onDrawFrame). Me aparece el error: "Asegúrese de que SurfaceView o SurfaceHolder asociado tenga una superficie válida". Obviamente, mEgl.eglCreateWindowSurface falla porque surfaceHolder no tiene una superficie válida. ¿Cómo puedo obtener un SurfaceHolder con una Surface válida para continuar?¿Cómo obtener un SurfaceHolder con una superficie válida (necesaria por EGL.eglCreateWindowSurface)?

método Mi Activity.onCreate es:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    GLSurfaceView surfaceView = new GLSurfaceView(this); 
    setContentView(surfaceView); 
    SurfaceHolder surfaceHolder = surfaceView.getHolder(); 
    Surface surface = surfaceHolder.getSurface(); 
    Log.v("HelloAndroid", "surface.isValid()= " + Boolean.toString(surface.isValid())); 

    EGL10 mEgl = (EGL10) EGLContext.getEGL(); 
    EGLDisplay mEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); 
    int[] version = new int[2]; 
    mEgl.eglInitialize(mEglDisplay, version); 
    EGLConfig[] configs = new EGLConfig[1]; 
    int[] num_config = new int[1]; 
    int[] configSpec = { 
      EGL10.EGL_NONE 
    }; 
    mEgl.eglChooseConfig(mEglDisplay, configSpec, configs, 1, num_config); 
    EGLConfig mEglConfig = configs[0]; 
    EGLContext mEglContext = mEgl.eglCreateContext(mEglDisplay, mEglConfig, 
      EGL10.EGL_NO_CONTEXT, null); 
    EGLSurface mEglSurface = null; 
    Log.v("HelloAndroid", "M"); 
    mEglSurface = mEgl.eglCreateWindowSurface(mEglDisplay, 
      mEglConfig, surfaceHolder, null); 
    Log.v("HelloAndroid", "N"); 
    mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, 
      mEglContext); 
    Log.v("HelloAndroid", "O"); 
} 

El registro de salida me sale con la plataforma de herramientas/LogCat ADB es:

V/HelloAndroid(1861): surface.isValid()= false 
D/libEGL (1861): egl.cfg not found, using default config 
D/libEGL (1861): loaded /system/lib/egl/libGLES_android.so 
V/HelloAndroid(1861): M 
D/AndroidRuntime(1861): Shutting down VM 
W/dalvikvm(1861): threadid=3: thread exiting with uncaught exception (group=0x4001b188) 
E/AndroidRuntime(1861): Uncaught handler: thread main exiting due to uncaught exception 
E/AndroidRuntime(1861): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.helloandroid/com.example.helloandroid.HelloAndroid}: java.lang.IllegalArgumentException: Make sure the SurfaceView or associated SurfaceHolder has a valid Surface 
E/AndroidRuntime(1861): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 

Cualquier ayuda se agradece.

Respuesta

2

Implemente SurfaceHolder.Callback, y espere hasta que le digan que se ha creado la superficie. También preste atención a cuando se destruye. Solo debe confiar en que la superficie sea válida entre las llamadas crear y destruir coincidentes.

+0

¿Es normal que el titular de tome mucho tiempo para tomar un montón de tiempo para dar una lectura de surface.is Valid() = true durante después del inicio de la aplicación? – Ashwin

4

La comprobación de validez de la superficie debe ser lo hicieron cuando la superficie es created.So, surface.isValid() debe ser llamado en onSurfaceCreated o onSurfaceChanged, obviamente, se debe añadir surfaceholder.callback

Cuestiones relacionadas