2

前の質問のとおり、GLSurfaceView + TextureView1 つの GLSurfaceView と複数の TextureView でカメラ プレビューを表示 しようとしていますが、いくつかの問題に直面しています...

GLSurfaceView レンダー スレッドで、組み込みの EGLContext を TextureView に共有し、TextureView の surfaceTexture で EGL サーフェスを作成し、GLES を使用してその上に描画しようとしました。

    @Override
    public void onDrawFrame(final GL10 gl) {
        // GLES draw on GLSurfaceView
        renderToTextureView();
    }

    private void renderToTextureView() {
        saveEGLState();
        for(TextureViewItem item : mTextureViewItemList) {
            item.render(mSavedEglContext);
        }
        restoreEGLState();
    }

    private void saveEGLState() {
        mSavedEglDisplay = EGL14.eglGetCurrentDisplay();
        mSavedEglContext = EGL14.eglGetCurrentContext();
        mSavedEglDrawSurface = EGL14.eglGetCurrentSurface(EGL14.EGL_DRAW);
        mSavedEglReadSurface = EGL14.eglGetCurrentSurface(EGL14.EGL_READ);
    }

    private void restoreEGLState() {
        if (!EGL14.eglMakeCurrent(mSavedEglDisplay, mSavedEglDrawSurface, mSavedEglReadSurface, mSavedEglContext)) {
            throw new RuntimeException("eglMakeCurrent failed");
        }
    }

    public class TextureViewItem implements TextureView.SurfaceTextureListener {
        private static EglCore sEglCore;
        private WindowSurface mWindowSurface;

        public void render(EGLContext sharedContext) {
            if(mSavedSurfaceTexture == null) return;
            getWindowSurface(sharedContext).makeCurrent();
            // GLES draw on TextureView
            getWindowSurface(sharedContext).swapBuffers();
        }

        private WindowSurface getWindowSurface(EGLContext sharedContext) {
            if(sEglCore == null) {
                sEglCore = new EglCore(sharedContext, EglCore.FLAG_TRY_GLES3);
            }
            if(mWindowSurface == null) {
                mWindowSurface = new WindowSurface(mEglCore, mSavedSurfaceTexture);
            }
            return mWindowSurface;
        }

        @Override
        public void onSurfaceTextureAvailable(SurfaceTexture st, int width, int height) {
            if (mSavedSurfaceTexture == null) {
                mSavedSurfaceTexture = st;
            }
        }

        @Override
        public boolean onSurfaceTextureDestroyed(SurfaceTexture st) {       
            if (mWindowSurface != null) {
                mWindowSurface.release();
            }
            if (sEglCore != null) {
                sEglCore.release();
            }

            mSavedSurfaceTexture = null;
            return true;
        }
    }

「戻る」キーを押す以外はすべて正常に機能します。アクティビティが一時停止したときに GLSurfaceView の onPause() を呼び出すと、swapBuffers (EGL14.eglSwapBuffers) が返されません...

一部の疑わしい logcat メッセージも
W/WindowManager(1077): Window freeze timeout expired.
I/WindowManager(1077): Screen frozen for +2s42ms due to Window ..

誰でも理由を知っていますか?そして、この問題を解決する方法はありますか?
ありがとう。

4

0 に答える 0