private EGL10 mEgl;
private GL10 mGl;
+ private volatile boolean mDrawPending = false;
+
private final Handler mEglHandler;
private final FrameDrawer mFrameDrawer;
if (mEglDisplay != null && mEglSurface != null) {
mFrameDrawer.onDrawFrame(mGl);
mEgl.eglSwapBuffers(mEglDisplay, mEglSurface);
+ mDrawPending = false;
}
mRenderLock.notifyAll();
}
}
};
- public class RenderThread extends Thread {
- private Boolean mRenderStopped = false;
-
- @Override
- public void run() {
- while (true) {
- synchronized (mRenderStopped) {
- if (mRenderStopped) return;
- }
- draw(true);
- }
- }
-
- public void stopRender() {
- synchronized (mRenderStopped) {
- mRenderStopped = true;
- }
- }
- }
-
public SurfaceTextureRenderer(SurfaceTexture tex,
Handler handler, FrameDrawer renderer) {
mEglHandler = handler;
initialize(tex);
}
- public RenderThread createRenderThread() {
- return new RenderThread();
- }
-
public void release() {
mEglHandler.post(new Runnable() {
@Override
*/
public void draw(boolean sync) {
synchronized (mRenderLock) {
- mEglHandler.post(mRenderTask);
- if (sync) {
- try {
- mRenderLock.wait();
- } catch (InterruptedException ex) {
- Log.v(TAG, "RenderLock.wait() interrupted");
+ if (!mDrawPending) {
+ mEglHandler.post(mRenderTask);
+ mDrawPending = true;
+ if (sync) {
+ try {
+ mRenderLock.wait();
+ } catch (InterruptedException ex) {
+ Log.v(TAG, "RenderLock.wait() interrupted");
+ }
}
}
}