我正在尝试使用time()来衡量我的程序的各个点.
我不明白为什么之前和之后的值是一样的?我知道这不是描述我的程序的最佳方式,我只想看看有多长时间.
printf("**MyProgram::before time= %ld\n", time(NULL));
doSomthing();
doSomthingLong();
printf("**MyProgram::after time= %ld\n", time(NULL));
Run Code Online (Sandbox Code Playgroud)
我试过了:
struct timeval diff, startTV, endTV;
gettimeofday(&startTV, NULL);
doSomething();
doSomethingLong();
gettimeofday(&endTV, NULL);
timersub(&endTV, &startTV, &diff);
printf("**time taken = %ld %ld\n", diff.tv_sec, diff.tv_usec);
Run Code Online (Sandbox Code Playgroud)
我如何阅读结果**time taken = 0 26339?这是否意味着26,339纳秒= 26.3毫秒?
那怎么说**time taken = 4 45025,这意味着4秒和25毫秒?
我正在使用 GLSurfaceView 创建自定义相机预览,使用 OpenGl 渲染相机提供给我的帧。我已经完全实现了相机,并按照我期望的方式工作,没有 fps 损失和正确的纵横比等。但是当我需要捕获来自相机源的帧时,问题出现了,我的第一个想法是使用 glReadPixles ()
使用 GLES20.glReadPixels() 我发现某些设备会出现 fps 损失,主要是屏幕分辨率较高的设备,这是有道理的,因为 glReadPixels 需要以更高分辨率读取更多像素。
我做了一些挖掘,发现其他人对 glReadPixels 也有类似的问题,许多人建议使用 PBO,最好使用其中两个作为双缓冲区,这将允许我读取像素数据,而不会阻塞/停止当前的渲染过程。我完全理解双缓冲的概念,我对 OpenGL 相当陌生,需要一些关于如何让双缓冲 PBO 工作的指导。
我找到了一些 PBO 双缓冲的解决方案,但我永远找不到完整的解决方案来完全理解它如何与 GLES 交互。
我的 GLSurfaceView.Renderer.onDrawFrame() 实现
// mBuffer and mBitmap are declared and allocated outside of the onDrawFrame Method
// Buffer is used to store pixel data from glReadPixels
mBuffer.rewind();
GLES20.glUseProgram(hProgram);
if (tex_matrix != null)
{
GLES20.glUniformMatrix4fv(muTexMatrixLoc, 1, false, tex_matrix, 0);
}
GLES20.glUniformMatrix4fv(muMVPMatrixLoc, 1, false, mMvpMatrix, 0);
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, tex_id);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, GLConstants.VERTEX_NUM);
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0); …Run Code Online (Sandbox Code Playgroud)