Android, OpenGL ES, Input and Latency Presented here is an overview of Ben's understanding of how Android works with respect to OpenGL ES rendering and input. This is for Android versions preceding version 4.1 since 4.1 introduced triple buffering which may affect things. Android uses EGL as the interface between OpenGL ES and the Android surface. The eglSwapBuffers call swaps the back buffer with the front buffer therefore displaying the results of the OpenGL ES calls. The Android GLSurfaceView class handles this for you, calling eglSwapBuffers after the call to the onDrawFrame method of the attached GLSurfaceView.Renderer. elgSwapBuffers blocks until the OpenGL ES processing has completed (the back buffer is completely rendered) and performs the swap at the next v-sync (so you do not see screen tearing). Therefore the GL rendering thread (created for you by the GLSurfaceView class) will be blocked until the elgSwapBuffers returns. Also the GLSurfaceView class allows you to set the OpenGL ES render mode to be continuous (loop and call onDrawFrame as soon as elgSwapBuffers returns) or when dirty (block until the app calls requestRender() on the GLSurfaceView object). You can find the implementation of GLSurfaceView as used by the cyanogenmod here (https://github.com/CyanogenMod/android_frameworks_base/blob/cm-10.1/opengl/java/android/opengl/GLSurfaceView.java). MotionEvents are delivered to an application by the Android system. You cannot poll the touch screen to find its current state. Android devices Ben has used deliver finger touch input events at about 50Hz to 60Hz. To reduce latency between the true touch position and the OpenGL ES render being displayed you want the continue to process touch events until as close as possible to v-sync therefore reducing the delay between the image being produced and the length of time elgSwapBuffers will block. You must allow enough time for the OpenGL ES calls to be made and complete otherwise you will miss the v-sync and elgSwapBuffers will block until the next v-sync.