【发布时间】:2019-03-12 13:43:22
【问题描述】:
我将 Yocto 用作带有 OpenGL 2.1、GLEW 2.0.0 和 Mesa 17.0.2 的嵌入式系统。我正在通过 HD/SDI 将屏幕软件渲染到监视器上。我遇到的问题是我的更新速率约为 1 赫兹。在我的开发机器上,当在 Debian 上禁用硬件加速时,我有大约 20 FPS。嵌入式机器没有那么强大,所以我理解性能受到影响,但 1 FPS 似乎有点低。对于我禁用的优化:
glDiasble(GL_LINE_SMOOTH)
glDiasble(GL_POINT_SMOOTH)
glDiasble(GL_SMOOTH)
glDiasble(GL_MULTISAMPLE)
glShadeModel(GL_NONE)
我没有任何剔除,因为我只使用 2D 图像。
不过,我确实将 min 和 mag 过滤器设置为 GL_NEAREST。
我的缓冲区交换和上下文创建类似于:
bool makeContext()
{
width = 1280;
height = 720;
context = OSMesaCreateContextExt(OSMESA_RGBA, 0, 0, 0, NULL);
if(!context)
{
//...
return false;
}
bufferSize = width * height * 4 * sizeof(GL_UNSIGNED_BYTE);
frameBuffer = (char*)mallic(bufferSize);
frameBuffer = (char*)0_buf_baseaddr;
if(!OSMesaMakeCurrent(context, frameBuffer, GL_UNSIGNED_BYTE, width, height));
{
//...
return false;
}
OSMesaPixelStore(OSMESA_Y_UP, 0)
{
//...
}
return true;
}
void swapBuffers()
{
frameBuffer = (char*) swap_page(); //returns a spot in memory with update
OSMesaMakeCurrent(context, frameBuffer, GL_UNSIGNED_BYTE, width, height);
}
我正在考虑应用模板,但我不确定这是否有助于提高性能。我几乎可以肯定这个问题源于我正在使用的图像中大量使用 Alpha 通道。多个移动层一个接一个地达到我想要的效果。
我的交换或创作有什么明显的问题吗?另外,根据我已经进行的优化,还有什么我可以做的可能有帮助的吗?
【问题讨论】:
-
您的嵌入式目标有哪些规格(CPU 速度、内存带宽等)?将帧缓冲区大小降至 320x240。 1280x720 是嵌入式目标的 很多 像素,更不用说桌面硬件了。您的嵌入式目标是否有多个内核?如果是这样,您是否使用 llvmpipe 后端?默认是多线程的。
-
检查你的 Mesa 是否支持
glInvalidateFramebuffer()到ARB_invalidate_subdata,它可能比直接的glClear()s 更快。 -
好问题,目前 CPU 速度未知,最大内存为 2 gigs。至于降低缓冲区大小,这不会改变我的图像在屏幕上的排列方式吗?比如说,我有一个位于 722、240(随机点)的图像。现在会在上下文之外绘制吗?既然我有一个剪刀测试,一起剪掉?另外,我将研究你提到的 glInvalidateFrameBuffer。这些都是很好的观点,非常感谢。
-
四核 ARM 1.5 GHz
-
你的 ARM 有 GL 驱动程序,对吧?如果驱动程序不存在,则 Mesa 将回退到软件渲染。请注意,ARM 通常没有 GL,并且大多数驱动程序都是 GLES。
标签: c++ performance opengl yocto mesa