0

我创建了一个简单的 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 并将其转换为 along会导致一些计算错误
  • 系统必须等待eglSwapBuffers()
  • 一旦函数onDrawFrame()完成,这仅意味着 OpenGL 命令已发送到管道。但这并不意味着命令已被处理。

但是我似乎仍然无法理解为什么我会得到如此高的抖动结果,而我基本上什么都没有计算。

问题的根源可能是什么?

测试环境:

  • 宏达一
  • CyanogenMod 10.2 (Android 4.3)

如果其他人可以复制这个,我会很高兴。

4

1 回答 1

-1

您会发现帧率不一致是由于 Log 语句造成的。如果您存储数据点,然后一次将它们全部记录下来,您会发现帧速率更加一致。使用类似下面的东西来记录数据。我每 1000 帧执行一次,得到的 dt 约为 16500-18500。

    mDt[mStoredDtCount] = dt;
    mStoredDtCount++;
    if (mStoredDtCount == DT_MAX_COUNT) {
        while (mStoredDtCount > 0) {
            mStoredDtCount--;
            Log.e("test2", "dt: "+mDt[mStoredDtCount]);
        }
    }
于 2013-10-26T17:15:47.850 回答