Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何';交换';android中GLSurfaceView实例中的渲染器?_Android_Opengl Es - Fatal编程技术网

如何';交换';android中GLSurfaceView实例中的渲染器?

如何';交换';android中GLSurfaceView实例中的渲染器?,android,opengl-es,Android,Opengl Es,在android中,我举了一个旋转球体的例子。它创建了一个显示旋转球体(地球)的简单应用程序 现在,在从GLSurfaceView派生的类中,我等待一个偶数(如触摸屏事件)来交换渲染器。我希望当前渲染器停止渲染,GLSurfaceView应该使用不同的渲染器(以显示其他对象) 我已尝试使用以下代码: public class MyGLSurfaceView extends GLSurfaceView { Context mycontext; MyGLSurfaceView(C

在android中,我举了一个旋转球体的例子。它创建了一个显示旋转球体(地球)的简单应用程序

现在,在从
GLSurfaceView
派生的类中,我等待一个偶数(如触摸屏事件)来交换渲染器。我希望当前渲染器停止渲染,
GLSurfaceView
应该使用不同的渲染器(以显示其他对象)

我已尝试使用以下代码:

public class MyGLSurfaceView extends GLSurfaceView {

    Context mycontext;

    MyGLSurfaceView(Context context) {
        super(context);
        mycontext = context;
    }

    public boolean onTouchEvent(MotionEvent event) {
        int x = (int)event.getX();
        int y = (int)event.getY();
        Log.d("onTouchEvent",String.format("keyCode: %d  coords: %d  %d", event.getActionMasked(), x, y));

        GlRenderer renderer = new GlRenderer(mycontext);
        setRenderer(renderer);
        return super.onTouchEvent(event);
    }
}
这会产生以下错误:

FATAL EXCEPTION: main
Process: com.jimscosmos.opengltexturedsphere, PID: 25708
java.lang.IllegalStateException: setRenderer has already been called for this instance.

我想我必须停止/删除/销毁“旧”渲染器,但我没有发现任何有用的东西。也许我的方法完全错了?还有什么要做的?如何做好这件事?

如果你坚持,从技术上讲,可以使用“调解人”来实现这一点,正如这里所建议的那样:


然而,我认为这是一个你真的不需要的开销。只需准备各种对象并在单个渲染器中更改各种渲染属性。

如果您坚持,从技术上讲,可以使用“中介器”来实现它,如下所示:


然而,我认为这是一个你真的不需要的开销。只需在单个渲染器中准备各种对象并更改各种渲染属性。

不,您不应该停止并更改渲染器。为什么不在同一个渲染器中交换对象?如何从
GLSurfaceView
中进行交换?也许您可以参考一个示例?不,从
onDrawFrame
函数中的渲染器中更改它。示例:
if(某物){drawSphere1();}else{drawSphere2();}
Ah我明白了。我会试试看,然后再打给你。非常感谢…不,你不应该停下来更改渲染器。为什么不在同一个渲染器中交换对象?如何从
GLSurfaceView
中进行交换?也许您可以参考一个示例?不,从
onDrawFrame
函数中的渲染器中更改它。示例:
if(某物){drawSphere1();}else{drawSphere2();}
Ah我明白了。我会试试看,然后再打给你。非常感谢…你能提供一些如何做到这一点的例子吗?我不认为有必要-这取决于你的具体实施。您的渲染器应该能够处理您希望它执行的任何任务,并根据您的需要切换任务(与您最初认为要更改渲染器的情况相同)。您可以提供一些示例来说明如何执行此操作吗?我不认为有必要-这取决于您的具体实现。渲染器应该能够处理您希望它执行的任何任务,并根据您的需要切换任务(与您最初认为要更改渲染器的情况相同)