9

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

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

4

6 回答 6

9

绘制二维颜色三元组数组的最快方法:

  1. 使用浮点(不是字节,不是双精度)存储。每个三元组由 3 个浮点数组成,每个浮点数从 0.0 到 1.0。这是 GPU 实现的最佳格式(但GL_LUMINANCE在不需要色调时使用灰度存储 - 更快!)
  2. 将数组上传到纹理glTexImage2D
  3. 确保GL_TEXTURE_MIN_FILTER纹理参数设置为GL_NEAREST
  4. 将纹理映射到适当的四边形。

这种方法比使用平台的本机 blittingglDrawPixels(由于某种原因往往实施得不好)并且快得多。

此外,当您的像素图未更改时,它使您可以选择重复执行第 4 步而无需第 2 步,这当然要快得多。

仅提供慢速本地 blitting 的库包括:

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

至于您可以期待的 FPS,在带有 Intel 显卡的 Intel Core 2 Duo 上绘制 1024x768 纹理:如果纹理每帧都发生变化,则大约 60FPS,如果不变化,则 >100FPS。

但你自己做,看看;)

于 2009-02-02T19:02:44.063 回答
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;
}
于 2009-02-02T18:59:28.797 回答
1

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

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

于 2009-02-02T17:28:16.783 回答
1

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

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

我的建议

  1. QT 如果你更喜欢 C++
  2. 开罗,如果你喜欢 C
于 2009-02-02T18:22:59.480 回答
1

“我可以期待多少 fps”的问题无法认真回答。即使您说出进行处理器布局的人的祖父,也不会。它取决于太多的变量。

  • 你需要渲染多少个三元组?
  • 他们在帧之间改变吗?
  • 以什么速率(如果每秒超过 30 次,您不会注意到变化)?
  • 是所有像素一直在变化还是只是某些区域的一些像素发生变化?
  • 您是否看到没有任何透视失真的像素?
  • 你总是看到所有的像素吗?
  • 根据 opengl 驱动程序的版本,您会得到不同的结果

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

于 2009-04-30T15:50:15.453 回答
0

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

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

于 2009-02-02T16:34:25.020 回答