手动创建时,默认情况下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
扩展的自己的实现。
答案 0 :(得分:1)
如果其他人面临同样的问题,我会回答我自己的问题。
据推测,默认情况下,新的SurfaceTexture会附加到GLContext,因为:
SurfaceTexture构造函数调用nativeInit
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
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
解决方案是手动分离这个新创建的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上下文中。