这个问题通常是由于系统时钟的不稳定性导致的。可以尝试使用Android提供的Choreograph类来获取更稳定和准确的时间戳,并以此来更新渲染。以下是一个简单的示例,展示如何使用Choreograph来替代Gaffer的固定时间戳:
import android.view.Choreographer;
public class MyGLSurfaceView extends GLSurfaceView implements Choreographer.FrameCallback {
private long mLastFrameTime = -1;
public MyGLSurfaceView(Context context) {
super(context);
Choreographer.getInstance().postFrameCallback(this);
}
@Override
public void doFrame(long frameTimeNanos) {
float deltaTime = (frameTimeNanos - mLastFrameTime) / 1000000000.0f;
mLastFrameTime = frameTimeNanos;
// Update and render your OpenGL scene here
Choreographer.getInstance().postFrameCallback(this);
}
}
在这个示例中,我们实现了Choreographer.FrameCallback接口,并在构造函数中注册了它。每当一个新的帧可用时,Android系统将调用我们的doFrame方法,并传递一个时间戳作为参数。我们可以使用这个时间戳来计算上一帧和当前帧之间的时间间隔,并据此来更新OpenGL场景。
注意,我们使用的时间戳单位是纳秒。为了避免由于精度问题造成的口吃,我们将其转换为秒,并使用浮点数来存储时间间隔。另外,我们在doFrame方法的最后一行再次向Choreographer注册自己,以确保下一个帧会及时到来。
使用Choreographer获取稳定的时间戳可以显著减少OpenGLES应用中的口吃问题。