【问题标题】:How to interrupt GLSurfaceView rendering phase and start a new one?如何中断 GLSurfaceView 渲染阶段并开始新的渲染阶段?
【发布时间】:2013-04-05 07:55:30
【问题描述】:

Android 开发者您好,

当模式等于“Render_when_dirty”时,中断 GLSurfaceView 的当前渲染阶段并开始新的渲染阶段的最佳方法是什么?我通过检查标志并从“onDraw”方法中调用的实际渲染方法返回人为地停止“onDraw”方法中的渲染;然后,在主线程的上下文中,我调用“requestRender()”来刷新场景。但是,由于我不知道的原因,一些中间的旧框架显示的时间很短(另一方面,它们会持续很长时间,以至于用户可以实现过渡) ;在 opengl es 2.x 引擎渲染实际场景之前。它根本不影响任何东西;但是修起来很麻烦。你有什么建议?

附:由于 GLSurfaveView 的实际渲染线程被破坏,在 onDraw 方法中抛出 InterruptedException 是没有用的。

亲切的问候。

【问题讨论】:

  • 不建议退出onDraw。当你有新的东西要画时,最好是requestRender,然后承诺实际绘制你在onDraw中的东西。

标签: android opengl-es-2.0 glsurfaceview


【解决方案1】:

当您说绘制了一些旧帧时 - 您的意思是绘制的帧的一部分是旧的还是多次调用 onDraw() 仍会导致一些旧信息显示在显示屏上。

我可以看到这里发生了一些事情。如果你有这样的 onDraw():

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

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

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

   onDrawFrame(){
   ... stuff..
   semaphore.acquire(); // lock the thread waiting for the state to update
   ... stuff ...

那么在锁定之前绘制的东西将是陈旧的(尽管仅适用于该帧 - 至少这是我所预期的)。

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

【讨论】:

    猜你喜欢
    • 2012-04-05
    • 2011-09-11
    • 2015-02-25
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多