這是我的情況:我需要預先加載2000張圖像並按順序將它們顯示爲60 fps的動畫。目前,我使用OpenGL加載bmp文件,但由於內存限制,我只能預加載多達500多個圖像。我怎麼解決這個問題?到目前爲止,我可以想出兩個解決方案:首先,也許我可以加載8位bmp圖像來節省內存。但我在使用glDrawPixels時遇到困難。其次,如果可能,我可以直接加載jpeg嗎?感謝您的任何建議!如何使用OpenGL加載8位bmp?
不使用視頻的原因是我需要通過跳過一個或多個圖像來更改動畫速度,如代碼中所示(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();
}
您無法首先在OpenGL中加載位圖,所以我猜JPEG不會更容易。但考慮使用壓縮紋理,無論您如何加載實際圖像數據。 – 2012-08-16 07:40:59