【问题标题】:Am I doing something wrong, or do Intel graphic cards suck so bad?我做错了什么,还是英特尔显卡太糟糕了?
【发布时间】:2011-01-19 22:51:14
【问题描述】:

我有

VGA 兼容控制器:Ubuntu 10.10 Linux 上的 Intel Corporation 82G33/G31 Express Integrated Graphics Controller (rev 10)。

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

英特尔卡这么差,还是我做错了什么?

驱动程序是来自英特尔的标准开源驱动程序。

我的代码:


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

编辑:也许不清楚 - 初始化在不同的函数中,并且只调用一次。

【问题讨论】:

  • 根据我的经验,没有经验数据支持,英特尔显卡非常糟糕。但无论如何,任何集成显卡都会很糟糕。
  • 我计划以英特尔显卡为目标,因此它可以在任何地方工作,但我希望我可以在静态 VBO 中显示 100 000 个带纹理的三角形用于地形 + 10-100 个小型静态 VBO 用于对象。如果这在英特尔卡上是不可能的,我将不得不瞄准更强大的东西。但这可能是我在做一些愚蠢的事情。
  • 我删除了你的链接,因为website is possibly dangerous
  • 确保您的系统启用了 OpenGL 加速: $ glxinfo | grep 渲染
  • Intel 卡在 LINUX 上太糟糕了。在 Windows 上,它们非常好。严重地。几年前,这一切都开始退化,我们正处于最糟糕的时期左右。

标签: linux performance intel opengl


【解决方案1】:

一些提示:

  • 使用该数量的顶点,您应该交错数组。顶点缓存通常不超过 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。

【讨论】:

    【解决方案2】:

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

    $ glxinfo | grep rendering
    direct rendering: Yes
    

    如果你得到“否”,那么你没有 OpenGL 加速。

    【讨论】:

      【解决方案3】:

      谢谢你的回答。

      是的,根据 glxinfo,我有直接渲染功能。在 glxgears 中,我得到了 150 FPS 之类的东西,而 Warzone 或 glest 之类的游戏运行速度足够快。所以可能问题出在我的代码中。

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

      【讨论】:

      • 我买了 geforce 210,一切都以 500 fps 运行。我猜英特尔卡确实很烂。
      猜你喜欢
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多