1

私は75*9 * 32の画像を持っており、PNG形式のハードドライブには合計64MBがあります。それぞれ128*256ピクセルの画像をロードすると、RAMに1.5GBのメモリが必要になります。ミップマップを有効にしていません。

GPUは生の画像しか保存しないためだと思いますが、メモリ使用量を増やす方法はありますか?

一度だけ作成されるフレームバッファオブジェクトを使用してテクスチャをロードしています。

テクスチャをロードするために以下を使用します。

        QImage catchImage = catchFbo->toImage();
        QImage t = QGLWidget::convertToGLFormat(catchImage);

        glGenTextures( 1, &Item::texture[i] );
        glBindTexture( GL_TEXTURE_2D, Item::texture[i] );
        glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits() );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );

編集:GL_RGBAの代わりにGL_COMPRESSED_RGBAが大きな違いを生むようです。現在、500MBを使用しています。

4

3 に答える 3

3

これは、GPUが生の画像のみを保存するためである可能性があると考えています。

もちろん、それらはraw形式です。GPUがDeflateとJPEG解凍を直接サポートするのは良いことですが、GPUはそれをサポートしていません。

メモリ使用量を増やす方法はありますか?

圧縮されたテクスチャ形式を使用できます。はい、最新のGPUオンザフライの解凍をサポートしていますが、使用されるコーデックはPNGやJPEGとは大きく異なります。

一度だけ作成されるフレームバッファオブジェクトを使用してテクスチャをロードしています。

なんで?FBOは他の目的のためのものです。このようなプロキシを使用せずに、ファイルからQImageを直接ロードできます。

于 2012-04-18T12:31:22.090 に答える
0

クリッピングを実装する必要があります。もちろん、それ自体ではメモリの占有を防ぐことはできないため、画像がビュースコープに含まれる場合は、画像を遅延読み込みする必要があります。これについてのまともな記事はここにあります。

于 2012-04-18T12:27:18.583 に答える
0

それらをより圧縮された形式に変換したり、ディスクから遅延ロードしたりできますが、それだけです。

于 2012-04-18T12:29:50.450 に答える