OpenGL ES 2.0 - 多个视图如何使用相同的渲染器?

时间:2012-08-25 23:26:00

标签: java android opengl-es-2.0

现在我有ApplicationActivity,此活动负责管理多个视图(GLSurfaceViews)。可以/我应该将所有视图设置为渲染器到“全局”渲染器吗?

代码:

public class ApplicationActivity extends Activity 
{
    private static final String TAG = ApplicationActivity.class.getSimpleName();

    private final Stack<Screen> screens = new Stack<Screen>();
    private GlRenderer glRenderer;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

            Log.d(TAG, "Main Activity Created");

        setupGraphics();

        ChangeScreen(new MainMenu(this, glRenderer)); //Creating a new Screen sets the renderer
    }

    private void setupGraphics()
    {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,     WindowManager.LayoutParams.FLAG_FULLSCREEN);

        glRenderer = new GlRenderer(this);
    }


    public void Draw() //Is called by the glRenderer onDrawFrame() { mainActivity.Draw() } 
    {

    }
}

GLSurfaceViews之间切换相同的活动,据我所知,我认为方法setRenderer设置了视图渲染器,然后启动渲染线程(创建新线程),但我不想要每次在视图之间切换时重新创建线程 - 可能会产生潜在的问题。

所以最后我想要一个Renderer类只是为了保持图形与业务逻辑等等,但是,我不知道是否可以使用一个Renderer,而不再设置线程?

2 个答案:

答案 0 :(得分:1)

只有在使用GLSurfaceView.onPause() / .onResume();

正确切换多个视图时才能使用相同的渲染器

我的具体案例:

@Override
protected void onPause() //Overrides onPause from Activity
{
    surfaceViews.peek().onPause();
    super.onPause();
}

因此每次活动暂停时我都必须暂停当前的视图。如果活动恢复,那么也恢复视图。

我还有一个名为SetView的方法,它将(暂停和删除然后更改为另一个视图)或(暂停然后更改为另一个视图)这是使用Stack

public void SetView(View screen)
{   
    if (!screens.empty())
    {
        screens.peek().onPause();
        screens.pop();
    }

    screens.push(screen);
    setContentView(screens.peek());
}

当然,因为我们现在使用的是Views而不是Activities,所以我们必须覆盖onBackPressed()以返回之前的视图。

@Override
public void onBackPressed() 
{       
    if (screens.size() == 1)
        super.onBackPressed();
    else
    {
        screens.pop();
        setContentView(screens.peek());
        screens.peek().onResume();
    }
}

答案 1 :(得分:0)

通过执行new GLRenderer(),您可以创建班级的新实例。因此,在不同的活动中使用相同的渲染器是没有问题的。

编辑:我似乎误解了你的问题 - 如果你想要同时看到许多GL表面,那么不,这是不可能的。但它与重用渲染器代码无关。