0

这是我的情况:我需要预加载 2000 张图像并按顺序显示它们以成为 60 fps 的动画。目前,我正在使用 OpenGL 加载 bmp 文件,但由于内存限制,我最多只能预加载 500 多个图像。我怎么解决这个问题?到目前为止,我可以提出两个方向的解决方案:首先,也许我可以加载 8 位 bmp 图像以节省内存。但我很难使用glDrawPixels。其次,如果可能的话,我可以直接加载 jpeg 吗?感谢您的任何建议!

不使用视频的原因是我需要通过跳过一个或多个图像来更改动画速度,如您在代码中看到的(imgCount+=stp; // stp 表示要转义多少图像。它可以使视频更快)。在我的动画中,帧率很重要,低于 50 的 FPS 会显示闪烁。

这是代码:

void Frame::LoadBMP(void){

 FILE *in;


 in=fopen(file,"rb");//open file 
 if(in==NULL){

     exit(0);
 }
 fread(&(this->bmfh),sizeof(BITMAPFILEHEADER),1,in);//read bmp file header
 fread(&(this->bmih),sizeof(BITMAPINFOHEADER),1,in);//read bmp infomation header

 colours=new RGBQUAD[bmih.biBitCount];
 fread(colours,sizeof(RGBQUAD),bmih.biBitCount,in);//read bmp colour table

 size=bmfh.bfSize-bmfh.bfOffBits;
 tempPixelData=new GLubyte[size];

 if(tempPixelData==NULL) {
     fclose(in);
 }
 fread(tempPixelData,sizeof(GLubyte),size,in);//read bmp image data
 fclose(in);
}

我将显示图像序列,显示代码:

void display(void){

static clock_t start=clock();
static clock_t end=clock();

CurrtempPixelData=msFrame[offset]->tempPixelData;

glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);

glDrawPixels(frWidth, frHeight, GL_RGBA, GL_UNSIGNED_BYTE, msFrame[offset]->tempPixelData);

for(int i=0;i<m;i++){
    clock_t c=clock();
}

glutSwapBuffers();
imgCount+=stp; // stp means how many images to escape. it can make video faster.
offset=imgCount%numFrame;
glutPostRedisplay();

}
4

2 回答 2

2

也许您根本不需要 2000 张图像并以 60fps 的速度显示它们?稳定的 25fps 足以应付任何电影。

我鼓励您重新考虑最初的问题并提出更合适的解决方案(视频、动画、矢量,也许还有其他东西)

至于原来的问题:

如果您只需要一次图像 - 在需要时将它们存储在内存中,并在显示后立即丢弃它们。

使用 DXT 打包图像。随着质量的轻微下降,您可以获得恒定的 x4/x8 压缩比。

如今,OpenGL 不太擅长使用调色板纹理(许多供应商的实现很差)。但是您可以使用着色器来实现它。

于 2012-08-16T05:34:23.083 回答
2
于 2012-08-16T05:38:34.110 回答