Comment obtenir un SurfaceHolder avec une pièce de Surface (nécessaire par EGL.eglCreateWindowSurface)?
J'essaie d'initialiser GLES avec EGL (parce que je veux en tirer le thread principal
au lieu d'utiliser un moteur de Rendu et le dessin de l'intérieur de onDrawFrame). J'obtiens l'erreur: "assurez-vous que le SurfaceView ou associés SurfaceHolder a une validité de Surface". Évidemment mEgl.eglCreateWindowSurface échoue parce que surfaceHolder est pas valide en surface. Comment puis-je obtenir un SurfaceHolder avec une pièce de Surface de procéder?
De Mon Activité.méthode onCreate est:
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");
}
Le journal de sortie j'obtiens avec platform-tools/adb logcat:
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)
Toute aide est appréciée.
OriginalL'auteur Thomas Mertes | 2011-04-07
Vous devez vous connecter pour publier un commentaire.
La case valide pour la surface doit être fait lorsque la surface est créée.Ainsi,la surface.isValid() doit être appelée dans onSurfaceCreated ou onSurfaceChanged,évidemment,vous devez ajouter surfaceholder.rappel
OriginalL'auteur Lee
Mettre En Œuvre SurfaceHolder.Rappel, et attendre jusqu'à ce que vous avez dit que la surface a été créé. Faites également attention à quand il est détruit. Vous devez compter que sur la surface valable entre le correspondant de créer et de détruire des appels.
OriginalL'auteur Laurence Gonsalves