我做错了什么,或者英特尔显卡是如此糟糕?

时间:2011-01-18 22:46:08

标签: linux performance intel opengl

我有

  

VGA兼容控制器:Ubuntu 10.10 Linux上的Intel Corporation 82G33 / G31 Express集成图形控制器(rev 10)。

我每帧静态渲染一个VBO。这个VBO有30,000个三角形,有3个灯和一个纹理,我得到15 FPS。

英特尔卡是如此糟糕,还是我做错了?

驱动程序是来自intel的标准开源驱动程序。

我的代码:


void init() {
  glGenBuffersARB(4, vbos);  
  glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbos[0]);
  glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLfloat) * verticesNum * 3, vertXYZ, GL_STATIC_DRAW_ARB);
  glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbos[1]);
  glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLfloat) * verticesNum * 4, colorRGBA, GL_STATIC_DRAW_ARB);
  glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbos[2]);
  glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLfloat) * verticesNum * 3, normXYZ, GL_STATIC_DRAW_ARB);
  glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbos[3]);
  glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLfloat) * verticesNum * 2, texXY, GL_STATIC_DRAW_ARB);
}

void draw() {
  glPushMatrix();

  const Vector3f O = ps.getPosition();

  glScalef(scaleXYZ[0], scaleXYZ[1], scaleXYZ[2]);
  glTranslatef(O.x() - originXYZ[0], O.y() - originXYZ[1], O.z()
          - originXYZ[2]);

  glEnableClientState(GL_VERTEX_ARRAY);
  glEnableClientState(GL_COLOR_ARRAY);
  glEnableClientState(GL_NORMAL_ARRAY);
  glEnableClientState(GL_TEXTURE_COORD_ARRAY);

  glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbos[0]);
  glVertexPointer(3, GL_FLOAT, 0, 0);

  glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbos[1]);
  glColorPointer(4, GL_FLOAT, 0, 0);

  glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbos[2]);
  glNormalPointer(GL_FLOAT, 0, 0);

  glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbos[3]);
  glTexCoordPointer(2, GL_FLOAT, 0, 0);

  texture->bindTexture();
  glDrawArrays(GL_TRIANGLES, 0, verticesNum);

  glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); //disabling VBO

  glDisableClientState(GL_VERTEX_ARRAY);
  glDisableClientState(GL_COLOR_ARRAY);
  glEnableClientState(GL_NORMAL_ARRAY);
  glEnableClientState(GL_TEXTURE_COORD_ARRAY);

  glPopMatrix();
}

编辑:也许不清楚 - 初始化是在不同的功能,只被调用一次。

3 个答案:

答案 0 :(得分:4)

一些提示:

  • 使用该数量的顶点,您应该交错数组。顶点缓存通常不超过1000个条目。交错数据当然意味着数据由一个VBO保存。

  • 如果存在大量共享顶点,则使用glDrawArrays是次优的,这可能是(静态)地形的情况。而是使用glDrawElements绘制。您可以使用索引数组来实现一些廉价的LOD

  • 试验给glDrawArrays的索引缓冲区中的顶点数。尝试最多2 ^ 14,2 ^ 15或2 ^ 16个指数的批次。这再次缓解了缓存压力。

哦,在你的代码中最后两行

  glDisableClientState(GL_VERTEX_ARRAY);
  glDisableClientState(GL_COLOR_ARRAY);
  glEnableClientState(GL_NORMAL_ARRAY); 
  glEnableClientState(GL_TEXTURE_COORD_ARRAY);

我认为你的意思是glDisableClientState。

答案 1 :(得分:0)

确保您的系统启用了OpenGL加速:

$ glxinfo | grep rendering
direct rendering: Yes

如果你得到'不',那么你没有OpenGL加速。

答案 2 :(得分:-1)

感谢答案。

是的,根据glxinfo,我有直接渲染。在glxgears中我得到150 FPS,像Warzone或glest这样的游戏工作得足够快。所以我的代码可能存在问题。

无论如何我最终会购买一些真正的显卡,但我也希望我的游戏能够在集成显卡上运行,这就是我发布这个问题的原因。