如何中断GLSurfaceView渲染阶段并启动一个新阶段?

时间:2013-04-05 07:55:31

标签: android opengl-es-2.0 glsurfaceview

嗨Android开发者,

当模式等于“Render_when_dirty”时,中断GLSurfaceView的当前渲染阶段并启动新阶段的最佳方法是什么?我通过检查一个标志并从“onDraw”方法中调用的实际渲染方法返回来人为地停止在“onDraw”方法中进行渲染;然后,在主线程的上下文中,我调用“requestRender()”来刷新场景。但是,由于我不知道的原因,一些中间旧帧显示的时间非常短(另一方面,它们忍受了很长一段时间,用户可以实现转换) ;在opengl es 2.x引擎呈现实际场景之前。它根本不会影响任何事情;但很难修复。你有什么建议?

P.S。由于GLSurfaveView的实际渲染线程被破坏,在onDraw方法中抛出InterruptedException是无用的。

亲切的问候。

1 个答案:

答案 0 :(得分:0)

当你说某些旧帧被绘制时 - 你的意思是绘制的帧的一部分是旧的还是多次调用onDraw()仍然会导致显示器上显示一些旧信息。

我可以在这里看到一些事情。如果您有这样的onDraw():

  onDrawFrame(){
  ... stuff ...
  if (stateVariableSet)
     return;
  ... stuff ...

我的理解是,当函数运行完成后,后面/前面的缓冲区被交换和绘制。这里可能发生的一件事是,当您尝试更新状态/状态变量时,您会看到一些onDrawFrame()调用。

另一方面,如果您有这样的事情:

   onDrawFrame(){
   ... stuff..
   semaphore.acquire(); // lock the thread waiting for the state to update
   ... stuff ...
然后在锁定之前绘制的东西将是陈旧的(仅限于那个框架 - 至少这是我预期的)。

您还在多核系统上运行吗?