我创建了一个简单的 Android 应用程序,如下所示:
活动:
public class MainActivity extends Activity {
private GLSurfaceView mGLView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGLView = new MyGLSurfaceView(this);
setContentView(mGLView);
}
}
OpenGL 表面:
class MyGLSurfaceView extends GLSurfaceView {
public MyGLSurfaceView(Context context){
super(context);
// Create an OpenGL ES 2.0 context
setEGLContextClientVersion(2);
// Set the Renderer for drawing on the GLSurfaceView
setRenderer(new MyGL20Renderer());
}
}
渲染器:
public class MyGL20Renderer implements GLSurfaceView.Renderer {
private long mCurrentTime;
public void onSurfaceCreated(GL10 unused, EGLConfig config) {
// Set the background frame color
GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
}
@Override
public void onDrawFrame(GL10 unused) {
final long newTime = getSystemTime();
final long dt = newTime - mCurrentTime;
mCurrentTime = newTime;
Log.e("test", "dt: "+dt);
// Redraw background color
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
}
@Override
public void onSurfaceChanged(GL10 unused, int width, int height) {
GLES20.glViewport(0, 0, width, height);
}
private long getSystemTime() {
return System.nanoTime()/1000L;
}
}
如您所见,对于每一帧,我采用 nanoTime 并将其除以 1000 以获得微秒时间。
现在,当我查看 中产生的输出时onDrawFrame()
,我得到了不同值的所有方式:
(此处为原始尺寸:http: //s14.directupload.net/images/131026/97pse5wo.png)。
x 比例只是帧。每帧一个值。y 尺度是增量时间,dt 在 中计算onDrawFrame()
。这是上一帧绘制所需的时间(以微秒为单位)。
现在我完全理解,由于以下原因,这些值不会停留在 16666 上:
- Delta时间无法完美确定。此外,将纳米时间除以 1000 并将其转换为 a
long
会导致一些计算错误 - 系统必须等待
eglSwapBuffers()
- 一旦函数
onDrawFrame()
完成,这仅意味着 OpenGL 命令已发送到管道。但这并不意味着命令已被处理。
但是我似乎仍然无法理解为什么我会得到如此高的抖动结果,而我基本上什么都没有计算。
问题的根源可能是什么?
测试环境:
- 宏达一
- CyanogenMod 10.2 (Android 4.3)
如果其他人可以复制这个,我会很高兴。