これが私の状況です。60fpsのアニメーションになるように、2000枚の画像をプリロードして順番に表示する必要があります。現在、OpenGLを使用してbmpファイルをロードしていますが、メモリの制限により、最大500以上の画像しかプリロードできません。どうすればこの問題を解決できますか?これまでのところ、2つの解決策を考え出すことができます。まず、メモリを節約するために8ビットのbmpイメージをロードできるかもしれません。しかし、glDrawPixelsを使用するのは困難です。次に、可能であればjpegを直接ロードできますか?アドバイスありがとうございます!
ビデオを使用しない理由は、コードに示されているように、1つ以上の画像をスキップしてアニメーション速度を変更する必要があるためです(imgCount + = stp; // stpは、エスケープする画像の数を意味します。ビデオを高速化できます)。そして私のアニメーションでは、フレームレートが重要であり、FPSが50未満の場合はちらつきが見られます。
コードは次のとおりです。
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();
}