我在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();
}