GLConsumer已附加到新SurfaceTexture的上下文

时间:2017-03-23 22:21:54

标签: android opengl-es textureview

手动创建时,默认情况下SurfaceTexture是否附加到GLContext?如果是这样,怎么样?

以下是一个示例,我尝试创建自己的SurfaceTexture并将其设置为TextureView

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView textView = (TextView) findViewById(R.id.version);
        TextureView textureView = (TextureView) findViewById(R.id.texture);

        int[] arr = new int[1];
        GLES20.glGenTextures(1, arr, 0);
        int texName = arr[1];

        SurfaceTexture surfaceTexture = new SurfaceTexture(texName);
        textureView.setSurfaceTexture(surfaceTexture);
    }
}

我经常得到:

  

E / GLConsumer:[unnamed-29058-0] attachToContext:GLConsumer已经   附加到上下文

例外:

  

E / AndroidRuntime:致命异常:主要                                                                                          处理:com.example.dkarmazin.openglesversion,PID:29058                                                                                          java.lang.RuntimeException:attachToGLContext期间出错(请参阅logcat   详情)                                                                                              在   android.graphics.SurfaceTexture.attachToGLContext(SurfaceTexture.java:215)                                                                                              在   android.view.GLES20TextureLayer.setSurfaceTexture(GLES20TextureLayer.java:86)                                                                                              在   android.view.HardwareRenderer $ Gl20Renderer.setSurfaceTexture(HardwareRenderer.java:2228)                                                                                              在android.view.TextureView.getHardwareLayer(TextureView.java:401)                                                                                              在android.view.View.getDisplayList(View.java:13443)                                                                                              在android.view.View.getDisplayList(View.java:13519)                                                                                              在android.view.View.draw(View.java:14297)                                                                                              在android.view.ViewGroup.drawChild(ViewGroup.java:3115)                                                                                              在android.view.ViewGroup.dispatchDraw(ViewGroup.java:2952)                                                                                              在android.view.View.getDisplayList(View.java:13472)                                                                                              在android.view.View.getDisplayList(View.java:13519)                                                                                              在android.view.View.draw(View.java:14297)                                                                                              在android.view.ViewGroup.drawChild(ViewGroup.java:3115)                                                                                              在android.view.ViewGroup.dispatchDraw(ViewGroup.java:2952)                                                                                              在android.view.View.draw(View.java:14583)                                                                                              在android.widget.FrameLayout.draw(FrameLayout.java:472)                                                                                              在android.view.View.getDisplayList(View.java:13477)                                                                                              在android.view.View.getDisplayList(View.java:13519)                                                                                              在android.view.View.draw(View.java:14297)                                                                                              在android.view.ViewGroup.drawChild(ViewGroup.java:3115)                                                                                              在android.view.ViewGroup.dispatchDraw(ViewGroup.java:2952)                                                                                              在android.view.View.draw(View.java:14583)                                                                                              在   android.support.v7.widget.ActionBarOverlayLayout.draw(ActionBarOverlayLayout.java:444)                                                                                              在android.view.View.getDisplayList(View.java:13477)                                                                                              在android.view.View.getDisplayList(View.java:13519)                                                                                              在android.view.View.draw(View.java:14297)                                                                                              在android.view.ViewGroup.drawChild(ViewGroup.java:3115)                                                                                              在android.view.ViewGroup.dispatchDraw(ViewGroup.java:2952)                                                                                              在android.view.View.getDisplayList(View.java:13472)                                                                                              在android.view.View.getDisplayList(View.java:13519)                                                                                              在android.view.View.draw(View.java:14297)                                                                                              在android.view.ViewGroup.drawChild(ViewGroup.java:3115)                                                                                              在android.view.ViewGroup.dispatchDraw(ViewGroup.java:2952)                                                                                              在android.view.View.getDisplayList(View.java:13472)                                                                                              在android.view.View.getDisplayList(View.java:13519)                                                                                              在android.view.View.draw(View.java:14297)                                                                                              在android.view.ViewGroup.drawChild(ViewGroup.java:3115)                                                                                              在android.view.ViewGroup.dispatchDraw(ViewGroup.java:2952)                                                                                              在android.view.View.draw(View.java:14583)                                                                                              在android.widget.FrameLayout.draw(FrameLayout.java:472)                                                                                              在   com.android.internal.policy.impl.PhoneWindow $ DecorView.draw(PhoneWindow.java:2326)                                                                                              在android.view.View.getDisplayList(View.java:13477)                                                                                              在android.view.View.getDisplayList(View.java:13519)                                                                                              在   android.view.HardwareRenderer $ GlRenderer.buildDisplayList(HardwareRenderer.java:1577)                                                                                              在   android.view.HardwareRenderer $ GlRenderer.draw(HardwareRenderer.java:1449)                                                                                              在android.view.ViewRootImpl.draw(ViewRootImpl.java:2530)                                                                                              在android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2402)                                                                                              在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2019)                                                                                              在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1079)                                                                                              在   android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5948)                                                                                              在   android.view.Choreographer $ CallbackRecord.run(Choreographer.java:761)                                                                                              在android.view.Choreographer.doCallbacks(Choreographer.java:574)                                                                                              在android.view.Choreographer.doFrame(Choreographer.java:544)                                                                                              在   android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:747)                                                                                              在android.os.Handler.handleCallback(Handler.java:733)                                                                                              在android.os.Handler.dispatchMessage(Handler.java:95)                                                                                              在android.os.Looper.loop(Looper.java:136)                                                                                              在android.app.ActivityThread.main(ActivityThread.java:5102)                                                                                              at java.lang.reflect.Method.invokeNative(Native Method)                                                                                              在java.lang.reflect.Method.invoke(Method.java:515)                                                                                              在   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:785)                                                                                              在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)                                                                                              在dalvik.system.NativeStart.main(本地方法)

在新创建的detachFromGLContext对象上调用SurfaceTexture可以解决问题,但由于我可以确认在这种情况下永远不会调用attachToGLContext,因此相当混乱。

P.S。我知道默认情况下TextureView拥有自己的SurfaceTexture。在这种情况下,我必须使用从SurfaceTexture扩展的自己的实现。

2 个答案:

答案 0 :(得分:1)

如果其他人面临同样的问题,我会回答我自己的问题。

据推测,默认情况下,新的SurfaceTexture会附加到GLContext,因为:

  1. SurfaceTexture构造函数调用nativeInit

  2. nativeInit对应于SurfaceTexture_init:https://android.googlesource.com/platform/frameworks/base.git/+/android-4.4.4_r2.0.1/core/jni/android/graphics/SurfaceTexture.cpp#337

  3. SurfaceTexture_init在此处创建一个新的GLConsumer:https://android.googlesource.com/platform/frameworks/base.git/+/android-4.4.4_r2.0.1/core/jni/android/graphics/SurfaceTexture.cpp#239

  4. 解决方案是手动分离这个新创建的SurfaceTexture 在调用超级构造函数之后立即从GLContext开始。

    public class MySurfaceTexture extends SurfaceTexture {
        public MySurfaceTexture(int texName) {
            super(texName);
            init();
        }
    
        private void init() {
            super.detachFromGLContext();
        }
    }
    

    我专门针对API-19查找了文档,但您可以按照相同的路径查找其他API级别。

答案 1 :(得分:1)

在Android O中有一个new constructor,它不会立即附加。听起来像你想要的那样。正如您的自我回答所说,之前的构造函数会自动附加到当前线程的GL上下文中。