在Raspberry Pi上,eglSwap缓存很慢

问题描述 投票:0回答:1

我目前将OpenGL应用程序(仅绘制2D内容)移植到OpenGL ES以在Raspberry Pi上正常运行。

出于某种原因,eglSwapBuffers花费了大量的时间。这是我做的基准测试(你可以看到我使用的功能):

****** BEGIN BENCHMARK RESULTS
GLESSTATS swap_buffers: 519,180 ms
GLESSTATS createShader: 5,508 ms
GLESSTATS createProgram: 3,584 ms
GLESSTATS setViewport: 0,010 ms
GLESSTATS createTexture: 17,087 ms
GLESSTATS bindTexture: 0,008 ms
GLESSTATS updateTexture: 2,192 ms
GLESSTATS drawGradientRect: 0,288 ms
GLESSTATS drawTexturedRect: 0,206 ms
****** END BENCHMARK RESULTS

目前我尝试创建一个RGBA表面。这些是我对EGL的属性:

EGLint ctx_attrs[] = {
    EGL_RENDERABLE_TYPE, OPEN_GL_ES2_BIT,
    EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
    EGL_RED_SIZE, 8,
    EGL_GREEN_SIZE, 8,
    EGL_BLUE_SIZE, 8,
    EGL_ALPHA_SIZE, 8,
    EGL_NONE
};

EGLint surf_attrs[] = {
    EGL_RENDER_BUFFER, EGL_BACK_BUFFER,
    EGL_NONE
};

我在这里做错了吗?我发现的只是窗口和表面之间的不匹配像素格式可能会使swap_buffers花费很长时间。我用R5G6B5,R8G8B8和R8G8B8A8尝试过它。

c opengl-es-2.0 raspberry-pi3
1个回答
1
投票

重要的是要记住GPU和CPU独立运行,因此对OpenGL驱动程序的调用通常是异步的。在某些时候,CPU必须坐下来等待那些OpenGL调用完成。

正如安德烈亚斯在上面的评论中提到的,强制执行此CPU / GPU同步的调用是glFinish(),并且恰好发生eglSwapBuffers实际上在开始交换缓冲区之前调用glFinish。

这意味着你的eglSwapBuffers的时间最有可能包括处理updateTexture,drawGradientRect,drawTexturedRect以及交换缓冲区的时间所花费的几乎所有时间。

我也希望你的计时单位错了?渲染帧的半秒对我来说听起来不是很好吗?你确定他们不是ns而不是ms?

另外,我希望你没有编译一个新的着色器并在每一帧中创建一个新的纹理? (只有当他们真正改变时才会这样做?)。如果需要在每个帧中创建新纹理,请确保在渲染完成后删除GL纹理,否则内存泄漏可能是导致速度减慢的原因。

© www.soinside.com 2019 - 2024. All rights reserved.