嗨Android开发者,
当模式等于“Render_when_dirty”时,中断GLSurfaceView的当前渲染阶段并启动新阶段的最佳方法是什么?我通过检查一个标志并从“onDraw”方法中调用的实际渲染方法返回来人为地停止在“onDraw”方法中进行渲染;然后,在主线程的上下文中,我调用“requestRender()”来刷新场景。但是,由于我不知道的原因,一些中间旧帧显示的时间非常短(另一方面,它们忍受了很长一段时间,用户可以实现转换) ;在opengl es 2.x引擎呈现实际场景之前。它根本不会影响任何事情;但很难修复。你有什么建议?
P.S。由于GLSurfaveView的实际渲染线程被破坏,在onDraw方法中抛出InterruptedException是无用的。
亲切的问候。
答案 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 ...
然后在锁定之前绘制的东西将是陈旧的(仅限于那个框架 - 至少这是我预期的)。
您还在多核系统上运行吗?