OpenGL E.S. 2.0:帧率很不一致

时间:2013-10-26 09:29:12

标签: android opengl-es

我创建了一个简单的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()中产生的输出时,我会得到各种不同的值:

Image (原始大小:http://s14.directupload.net/images/131026/97pse5wo.png)。

x-scale 只是框架。每帧一个值。 y-scale 是delta-time,dt以onDrawFrame()计算。这是前一帧绘制所用的时间,以微秒为单位。

现在我完全理解,由于以下原因,价值观并未停留在16666:

  • Delta时间无法完美确定。此外,将纳米时间除以1000并将其转换为long会导致一些计算错误
  • 系统必须等待eglSwapBuffers()
  • 函数onDrawFrame()完成后,这只表示OpenGL命令已发送到管道。但这并不意味着命令已被处理。

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

可能是问题的根源是什么?

测试环境:

  • HTC One
  • CyanogenMod 10.2(Android 4.3)

如果有其他人可以重现这一点,我会很高兴。

1 个答案:

答案 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]);
        }
    }