如何从GLSurfaceView更改内容视图?

时间:2011-03-06 18:44:12

标签: android opengl-es

我正在开发一款小游戏,在设置GLSurfaceView时我在修改Activity的内容视图时遇到问题,让我来描述该应用的工作原理:

该应用只有一个Activity,它以静态视图开始:setContentView(R.layout.main);,当用户使用菜单发送某个输入时,GLSurfaceView被实例化并通过setContentView(gameSession);设置(其中) gameSession是扩展GLSurfaceView的类。然后,GLSurfaceView类设置运行实际应用程序逻辑的渲染器。

现在发生的事情是游戏逻辑(在Renderer内部运行)是负责知道游戏何时结束并且视图应该变回R.layout.main的人,然后渲染器调用GLSurfaceView上的synchronized方法,通知活动被更改(再次使用setContentView(R.layout.main);)。

问题就出现了,只要setContentView(R.layout.main);被调用,一切都会挂起,GLSurfaceView仍然存在(只是不再进行更新)。我担心我遇到了僵局,Activity等待Renderer在删除之前完成。

我一直在考虑一些解决方案,但所有这些解决方案带来了其他问题:

  1. GLSurfaceViewActivity通过轮询渲染器上的标志来查看游戏是否结束,但这些类上没有循环,(以及onDraw上的永远不会调用GLSurfaceView
  2. 使用queueEvent()方法,但Renderer类没有它(并使用GLSurfaceView.queueEvent()不起作用,因为Runnable仍然是呈现器线程)
  3. 只是为了检查游戏结束而实现某种消息线程,但这听起来像是浪费资源。

  4. 你们中是否有人遇到过类似的问题?如果交换时间的逻辑在Activity上,那么将GLSurfaceView的内容视图从Renderer更改为其他内容的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

您不应该致电setContentView() multiple times

您可以使用多个活动,在完成游戏活动后调用finish()返回静态视图活动。