0

これが私の状況です。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();

}
4

2 に答える 2

2

たぶん、2000枚の画像を用意して60fpsで表示する必要はまったくないのでしょうか。安定した25fpsは、どの映画にも十分です。

元の問題を再考し、より適切な解決策(ビデオ、アニメーション、ベクトル、おそらく他の何か)を考え出すことをお勧めします

元の質問について:

画像が1回だけ必要な場合は、必要なときにメモリに保存し、表示した直後に破棄します。

DXTパックされた画像を使用します。品質がわずかに低下すると、一定のx4/x8圧縮比が得られます。

最近のOpenGLは、パレットテクスチャの操作があまり得意ではありません(多くのベンダーの実装は不十分です)。ただし、シェーダーを使用して実装できます。

于 2012-08-16T05:34:23.083 に答える
2
于 2012-08-16T05:38:34.110 に答える