为什么VirtualBox上的OpenGL状态变化非常慢?

时间:2014-01-04 01:40:14

标签: opengl virtualbox

我在Linux主机上并使用Windows来宾。

我用SDL创建OpenGL上下文,我只是在不同位置绘制1000个对象,每个对象只有6个顶点和3个线,只是一个3D交叉。

我使用顶点和索引缓冲区以及GLSL着色器。它没有做任何特殊的事情:它绑定缓冲区并设置顶点attrib指针,设置矩阵并绘制元素。

它在2秒内呈现场景,如果我将缓冲区绑定和属性设置提升到它在200ms内呈现的循环外,如果我移除了由于更新位置而设置矩阵的glUniformMatrix4fv,它将渲染大约10ms,虽然我只看到1个物体,但其他数千个物品只是透支了它。

在Linux和Windows主机上,同样的东西渲染在稳定的60FPS上。

像OpenArena这样的OpenGL游戏在VirtualBox中运行60FPS ......

缓冲区绑定和统一设置一般在OpenGL中运行缓慢吗?

有没有人有在VirtualBox上测试3D程序的经验?

更新:添加了一些代码,为清晰起见,删除了错误检查:

void drawStuff()
{
    GLfloat projectView[16];
    int ms;
    RenderingContext rc; /*< Nothing special contains the currently bound render object.*/

    glClearColor(0, 0, 0, 1);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    createViewMatrix(
        viewMatrix,
        &viewedObject->attitude.k,
        &viewedObject->attitude.j,
        &viewedObject->pos
    );

    multiplyMatrix(projectView, viewMatrix, projMatrix); /*< Combine projection and view matrices. */

    /* Draw 10×10×10 grid of 3D crosses. One cross is 6 vertices and 3 lines. */
    bindRenderObject(&rc, &cross); /*< This binds buffers and sets up vertex attrib arrays. It's very slow if I put it into the loop*/
    {
        int i, j, k;
        for (i = -5; i < 5; i++)
        {
            for (j = -5; j < 5; j++)
            {
                for (k = -5; k < 5; k++)
                {
                    createTranslationMatrix(modelMatrix, i * 10, j * 10, k * 10);

                    multiplyMatrix(combinedMatrix, modelMatrix, projectView);
                    glUniformMatrix4fv(renderingMatrixId, 1, GL_FALSE, combinedMatrix); /*< This is slow for some reason.*/

                    drawRenderObject(&rc); /*< This is just a call to glDrawElements. No performance bottleneck here at all. */
                }
            }
        }
    }

    /* Draw some UI. */
    glDisable(GL_DEPTH_TEST);

    /* ... */

    glEnable(GL_DEPTH_TEST);

    SDL_GL_SwapBuffers();
}

0 个答案:

没有答案