目标语言是 C/C++,程序只能在 Linux 上运行,但平台独立的解决方案显然是首选。我运行 Xorg,XVideo 和 OpenGL 都可用。
在配备英特尔显卡的英特尔酷睿 2 双核上,我可以在 1024x768 上获得多少 FPS?(仅绘制计数,考虑阵列在 RAM 中已准备好;不需要精确的预测)
绘制二维颜色三元组数组的最快方法:
GL_LUMINANCE
在不需要色调时使用灰度存储 - 更快!)glTexImage2D
GL_TEXTURE_MIN_FILTER
纹理参数设置为GL_NEAREST
这种方法比使用平台的本机 blitting略快glDrawPixels
(由于某种原因往往实施得不好)并且快得多。
此外,当您的像素图未更改时,它使您可以选择重复执行第 4 步而无需第 2 步,这当然要快得多。
仅提供慢速本地 blitting 的库包括:
至于您可以期待的 FPS,在带有 Intel 显卡的 Intel Core 2 Duo 上绘制 1024x768 纹理:如果纹理每帧都发生变化,则大约 60FPS,如果不变化,则 >100FPS。
但你自己做,看看;)
不久前我使用 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;
}
如果您想将像素转储到屏幕上,您可能需要使用sdl 的 “表面”功能。为了获得最佳性能,请尝试将输入数据安排在与输出表面相似的布局中。如果可能,请避免在表面中一次设置一个像素。
SDL 本身并不是一个硬件接口,而是一个可移植层,可以很好地在许多其他显示层之上运行,包括 DirectX、OpenGL、DirectFB 和 xlib,因此您可以获得非常好的可移植性,而且它是一个非常薄的层在这些技术之上,因此您在这些技术之上支付的性能开销很少。
“我可以期待多少 fps”的问题无法认真回答。即使您说出进行处理器布局的人的祖父,也不会。它取决于太多的变量。
这可能会永远持续下去,答案完全取决于您的算法。如果您坚持使用 opengl 方法,您还可以尝试不同的扩展(例如http://www.opengl.org/registry/specs/NV/pixel_data_range.txt),看看它是否更适合您的需求;虽然已经提到的 glTexSubImage() 方法非常快。
在 1024x768 上我可以期待多少 FPS?
这个问题的答案取决于许多无法判断的因素。