在屏幕上绘制2D三维颜色三元组的最快方法是什么?

时间:2009-02-02 16:29:57

标签: c linux opengl draw xorg

目标语言是C / C ++,程序只能在Linux上运行,但平台无关的解决方案显然是首选。我可以使用Xorg,XVideo和OpenGL。

英特尔酷睿2双核英特尔显卡在1024x768上可以获得多少FPS? (只有绘图计数,考虑在RAM中准备好阵列;不需要精确预测)

6 个答案:

答案 0 :(得分:9)

绘制二维彩色三联体阵列的最快方法:

  1. 使用float(字节, double)存储。每个三联体由3个浮子组成,每个浮子从0.0到1.0。这是GPU最佳实现的格式(但在不需要色调时使用灰度GL_LUMINANCE存储 - 速度更快!)
  2. 将数组上传到包含glTexImage2D
  3. 的纹理
  4. 确保GL_TEXTURE_MIN_FILTER纹理参数设置为GL_NEAREST
  5. 将纹理映射到适当的四边形。
  6. 这种方法比glDrawPixels略快(由于某种原因往往被严重执行)和很多比使用平台的原生blitting更快。

    此外,当您的像素图没有改变时,它可以让您选择在没有步骤2的情况下重复执行步骤4,这当然要快得多。

    仅提供慢速原生blitting的库包括:

    • Windows'GDI
    • X11上的SDL(在Windows上,它在使用HW_SURFACE时提供快速的opengl后端)
    • Qt的

    至于FPS,你可以期待在英特尔酷睿2双核处理器上使用英特尔图形绘制1024x768纹理:如果纹理每帧都改变大约60FPS,如果不改变则大于100FPS。

    但是你自己去看看吧。)

答案 1 :(得分:6)

我使用C和OpenGL做了一段时间,并通过创建一个全屏大小的四边形,然后使用纹理映射将位图传输到四边形的面上,获得了非常好的性能。

这是一些示例代码,希望您可以使用它。

#include <GL/glut.h>
#include <GL/glut.h>

#define WIDTH 1024
#define HEIGHT 768

unsigned char texture[WIDTH][HEIGHT][3];             

void renderScene() {    

    // render the texture here

    glEnable (GL_TEXTURE_2D);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    glTexImage2D (
        GL_TEXTURE_2D,
        0,
        GL_RGB,
        WIDTH,
        HEIGHT,
        0,
        GL_RGB,
        GL_UNSIGNED_BYTE,
        &texture[0][0][0]
    );

    glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0, -1.0);
        glTexCoord2f(1.0f, 0.0f); glVertex2f( 1.0, -1.0);
        glTexCoord2f(1.0f, 1.0f); glVertex2f( 1.0,  1.0);
        glTexCoord2f(0.0f, 1.0f); glVertex2f(-1.0,  1.0);
    glEnd();

    glFlush();
    glutSwapBuffers();
}

int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);

    glutInitWindowPosition(100, 100);
    glutInitWindowSize(WIDTH, HEIGHT);
    glutCreateWindow(" ");

    glutDisplayFunc(renderScene);

    glutMainLoop();

    return 0;
}

答案 2 :(得分:1)

如果您尝试将像素转储到屏幕,则可能需要使用sdl's '表面'设施。为获得最佳性能,请尝试安排输入数据与输出表面的布局类似。如果可能的话,避免在表面上一次设置一个像素。

SDL本身不是硬件接口,而是一个可在许多其他显示层(包括DirectX,OpenGL,DirectFB和xlib)上运行良好的可移植层,因此您可以获得非常好的可移植性,并且在这些技术之上的非常薄的层,所以你在这些技术之上支付很少的性能开销。

答案 3 :(得分:1)

除SDL之外的其他选项(如上所述)

    带有浮华的
  • Cairo曲面(在C中适用于所有平台,但在Linux中最佳)
  • QT Canvas(在C ++中,多平台)
  • OpenGL原始API或QT OpenGL(您需要知道openGL)
  • 纯Xlib / XCB,如果你想考虑非opengl平台

我的建议

  1. QT如果您更喜欢C ++
  2. 开罗,如果你更喜欢C

答案 4 :(得分:1)

“我能期待多少fps”问题无法得到认真回答。即使你给那个做处理器布局的人的爷爷起了个名字。它取决于太多的变量。

  • 您需要渲染多少个三元组?
  • 他们在帧之间做了什么改变?
  • 以什么速度(如果它经常超过30次,你不会注意到这种变化)?
  • 所有像素都会一直变化,或者只是某些区域的某些像素会变化吗?
  • 您是否看到没有任何透视变形的像素?
  • 你总能看到所有的像素吗?
  • 取决于opengl驱动程序的版本,您将获得不同的结果

这可以永远持续下去,答案绝对取决于你的算法。如果您坚持使用opengl方法,您也可以尝试不同的扩展(例如http://www.opengl.org/registry/specs/NV/pixel_data_range.txt),以确定它是否更符合您的需求;虽然已经提到的glTexSubImage()方法非常快。

答案 5 :(得分:0)

  

在1024x768上我可以期待多少FPS?

这个问题的答案取决于许多无法分辨的因素。