我创建了一个简单的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 Surface:
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-scale 只是框架。每帧一个值。 y-scale 是delta-time,dt以onDrawFrame()
计算。这是前一帧绘制所用的时间,以微秒为单位。
现在我完全理解,由于以下原因,价值观并未停留在16666:
long
会导致一些计算错误eglSwapBuffers()
onDrawFrame()
完成后,这只表示OpenGL命令已发送到管道。但这并不意味着命令已被处理。但我似乎无法理解为什么我会得到如此高的抖动结果,而我基本上没有计算任何东西。
可能是问题的根源是什么?
测试环境:
如果有其他人可以重现这一点,我会很高兴。
答案 0 :(得分:-1)
您会发现不一致的帧速率是由Log语句引起的。如果您存储数据点,然后一次记录它们,您将看到帧速率更加一致。使用以下内容记录数据。我每隔1000帧就做到这一点,得到了大约16500-18500的dt。
mDt[mStoredDtCount] = dt;
mStoredDtCount++;
if (mStoredDtCount == DT_MAX_COUNT) {
while (mStoredDtCount > 0) {
mStoredDtCount--;
Log.e("test2", "dt: "+mDt[mStoredDtCount]);
}
}