テクスチャはGPUでどのくらいのメモリを消費しますか?


9

ディスク上の大きなpngは数メガバイトしか使用しない場合がありますが、gpuでは同じpngが圧縮されていない形式で保存され、より多くのスペースを占めると思います。これは本当ですか?それが本当なら、どのくらいのスペースですか?

回答:


16

JPGファイルとPNGファイルは、ほとんどの場合、ディスク上のメモリよりも小さくなります。これらは、生のRGBデータを取得するためにオンザフライで解凍する必要があるため、ロードのためにより多くの処理能力と、その後により多くのRAMを必要とします。多くの最新のエンジンは、メモリと同じフォーマットをディスクに保存することを選択しているため、テクスチャのメモリ要件と同じサイズのファイルになります(ただし、PNGまたはJPGよりも大きい)。RGB / RGBAおよびS3TC / DXTn / BCnは、何も処理せずにメモリに直接読み込まれるため、最も広く使用されている形式です(DXTテクスチャは事前圧縮されています)。

したがって、これらはさまざまな一般的なテクスチャフォーマットのサイズです。

  • L(輝度、グレースケールなど):幅*高さ* 1バイト。
  • LA(輝度とアルファ、フォントに共通):幅*高さ* 2バイト。
  • RGB(色、アルファなし):幅*高さ* 3バイト。
  • RGBA(アルファ付きの色):幅*高さ* 4バイト。
  • DXT1 / BC1(色、バイナリアルファ):(幅*高さ* 4バイト)/ 8(8:1の圧縮率)。
  • DXT3 / BC2(カラー、シャープアルファ)/ DXT5 / BC3(カラー、グラデーションアルファ):(幅*高さ* 4バイト)/ 4(4:1の圧縮率)。

ミップマップで画像を使用する場合、テクスチャには4/3のメモリが必要になります。さらに、テクスチャの幅と高さは内部で切り上げられ、古いまたは機能の少ないハードウェアでは2の累乗になる場合があります。

DXTに関する詳細情報:非可逆圧縮です。つまり、テクスチャを圧縮すると、一部のカラーデータが失われます。これはテクスチャに悪影響を及ぼし、鋭い境界をゆがめ、グラデーションに「ブロック」を作成します。しかし、メリットはデメリットよりもはるかに優れています(DXTでひどく悪いテクスチャを使用している場合は、圧縮しないでください。他のテクスチャがサイズの損失を補います)。また、ピクセルは固定サイズのブロックによって圧縮されるため、テクスチャの幅と高さは4の倍数でなければなりません。


これは最初の文を除いて正しいです。ディスク上のテクスチャのフォーマットは、高度に圧縮された任意のフォーマットにすることができます。そのため、メモリフォーマットの直接シリアル化であるディスクフォーマットを除いて、VRAMと同じようにディスク上のスペースを使用しません。

もちろん可能ですが、Unreal EngineやSourceなどで構築されたゲームで使用されるアセットを確認してください。現在、リソースを圧縮しないでおくのに十分なディスクスペースがあるため、通常はディスク上で圧縮されません。また、節約されたスペースは、ロードごとにファイルを解凍するために必要な追加のRAMおよびCPU時間を補うものではありません。
r2d2rigo 2010年

1
エンジンごとに異なります。より大きなエンジンの多く、特にコンソールで動作するものは、メモリフォーマットと同じか、それに近いディスクフォーマットを使用します。しかし、PNGまたはJPEGアセットが付属するPC専用ゲームを見つけるのは非常に簡単です。とにかく負荷のためにディスクに行かなければならない場合、それはとにかくあなたの時間を支配するでしょう。さらに、マイクはディスク形式として特にPNGとJPEGについて言及しています。

RGB形式は通常、実際にはGPUに存在しないことを除いて、ほとんどが正しいです。参照:opengl.org/wiki/Common_Mistakes#Texture_upload_and_pixel_reads
Maximus Minimus

9

明らかに:それはフォーマットに依存します。

256 x 256ピクセルの正方形のテクスチャを見てみましょう。圧縮されていない32ビットのアルファチャネル(ColorXNAの場合)の場合、256KB256*256*4バイト)かかります。

16ビット形式(例:)Bgr565は明らかにサイズの半分-128KBになります。

次に、圧縮形式に移行します。XNAには、DXT1、DXT3、およびDXT5(別名S3圧縮)があります。これは非可逆圧縮形式です。これは、ブロックベースのフォーマットでもあります。つまり、そこからサンプリングできます(ピクセルが含まれているブロックがわかっているため)。また、使用する帯域幅が少ないため、速度も向上します。

DXT1の圧縮比は8:1で、DXT3とDXT5の圧縮比は4:1です。

したがって、256x256のDXT1イメージは32KBです。また、DXT3またはDXT5は64KBです。

そして、ミップマッピングがあります。これが有効になっている場合、これにより、以前の半分のサイズのグラフィックスメモリに一連の画像が作成されます。したがって、256x256イメージの場合:128x128、64x64、32x32、16x16、8x8、4x4、2x2、1x1。ミップマッピングのあるテクスチャは、元のサイズの約133%です。


4

ほとんどのGPUは特定の圧縮形式のみを読み取ることができます。例えば。BC *、DXT *、pngなどの形式ではありません。そのため、はい、ほとんどの場合、.pngはディスク上よりもビデオメモリ内で多くのスペースを使用します。

テクスチャは、ビデオメモリとシステムメモリの両方に圧縮または非圧縮で保存できます。

非圧縮テクスチャの場合、一般的な経験則では、システムメモリの非圧縮形式と同じ量のビデオメモリ領域が使用されます。

DXT1圧縮テクスチャ用。GPUは、テクスチャの4x4タイルごとに8バイトを格納します。非圧縮データ(RGBチャネルごとに8ビット)は通常4x4x3 = 48バイトなので、圧縮率は6:1になります。DXT3 / DXT5圧縮テクスチャの場合、GPUはテクスチャの4x4タイルごとに16バイトを格納します。これは、わずかに低い圧縮率3:1です。

非圧縮テクスチャと圧縮テクスチャの両方に関するいくつかの警告があります。

  • ほとんどのメモリは、固定サイズのページ(GPU間でサイズが異なる)で割り当てられます。例えば。4KB。多くの場合、サブアロケーションされておらず、他のgpuデータと共有されていません。つまり。テクスチャフットプリントがページサイズよりも小さい場合でも、vid memのフットプリントはページサイズのままであることがよくあります。

  • 一部のgpusには、非常に具体的な配置要件があります。これまで、一部のGPUでは、テクスチャのサイズが2の累乗である必要がありました。これは、テクスチャからサンプリングするときのアクセスの局所性を改善するために、スウィズル表現(Morton Ordering:http : //en.wikipedia.org/wiki/Z-order_ (curve )を参照)をサポートするためにしばしば必要でした。つまり、これらの要件を維持するために、奇数サイズのテクスチャにパディングが行われます(通常、このパディングはドライバーによって処理されます)。現代のgpusではモートンオーダーを使用する必要はありませんが、gpuの特定の要件をサポートするために肥大化している可能性があります。

  • 特に破棄ロックを使用している場合は、テクスチャの複数の表現がいつでもメモリに存在する可能性があります。これは、表現がgpuによって使用されなくなるまでメモリ使用量を膨らませる可能性があります(これは通常、CPUレンダリングの背後にある数フレームです)。

  • ミップマッピングを有効にすると、追加のミップは平均でベースミップレベルの約3分の1を消費します。上記の警告に基づくYMMV。


0

AFAIKは画像の幅*高さ* BPPであり、PNG、JPG、またはBMPであるかどうかは関係ありません。DDSやその他の圧縮可能な形式がどのように配置されているのかわかりません。

ミップマッピングにより、ビデオメモリの必要性が高まります。

このトピックに関する私の知識は少し古いかもしれません。少し前に3Dを放棄しました。


2
画像にはピッチ(ストライド)もあります。これは、1行の終わりから次のピクセル行の始まりまでのバイト数です。他の誰もこれについて言及していないので、私は誤解される可能性があります。
CiscoIPPhone

1
通常、「ピッチ」はスキャンラインの長さをバイト単位で表し(FreetypeやSDLのように)、「ストライド」は要素間のスペースを指し、ピクセルまたはスキャンライン(OpenGLおよびPythonの3番目のスライス引数のように)である場合があります。画像処理を行うには両方の値が必要ですが、「通常」pitch = width * bytes_per_pixelおよびstride = 0です。用語は大まかに使用され、混乱しているため、選択したライブラリのAPIドキュメントを確認することをお勧めします。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.