2013-04-05 140 views
0

您好Android开发人员,如何中断GLSurfaceView渲染阶段并开始新阶段?

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

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

亲切的问候。

+0

救助的'不建议onDraw'。当你有新的东西绘制时,最好是'requestRender',然后提交实际绘制'onDraw'中的内容。 – fadden 2013-04-18 00:16:15

回答

0

当你说一些旧的框架被绘制 - 你的意思是绘制框架的一部分是旧的或onDraw()的多个调用仍然导致一些旧信息显示在显示器上。

有几件事情,我可以看到发生在这里。如果你有一个的onDraw()这样的:

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

我的理解是,当该功能完成正在运行,即正面/背面缓冲区被换和绘制。这里可能发生的一件事情是,当您尝试更新状态/状态变量时,会看到一些onDrawFrame()调用正在呈现。

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

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

则已经绘制之前,锁将过时的东西(该帧只,但 - 至少这就是我想要预料)。

也是你多核系统上运行?