web-dev-qa-db-ja.com

VRAMは正確には何に使用されますか?

私のラップトップには、専用のビデオRAMを備えたNice GPUが搭載されています。しかし、Minecraftをプレイしているときに、コンピューターがsingのように見えないことに気付きました。 Windowsタスクマネージャーによると、使用されるのは約100 MBだけですが、通常のRAMの約半分を消費します。

VRAMはモデルやテクスチャなどを格納するために使用され、通常のRAMへの要求を減らすと考えていました。それが本当なら、テクスチャとモデルは私が思っていたよりもずっと小さくなければなりません。 (これは大幅に変更されたインストールであり、標準のMinecraftよりもはるかに複雑なモデルとテクスチャーがあることに注意してください。)

それが真実ではない場合、どのis VRAMを使用するのですか?私のコンピューターにそれをより有効に利用させる方法はありますか?

16
Hearth

ビデオRAMは、ビデオのフレームをレンダリングするために必要なすべてのものを格納するように特別に設計されています。ゲームの場合、これには、テクスチャ、モデル、およびシェーダー情報やライティングマップなどの他のグラフィック固有のデータが含まれます。一般的に、このデータはメインシステムに保存されていませんRAM先ほど触れましたが、VRAMは通常のRAMの需要を減らすように特別に設計されていません。

Minecraftは、ほとんどのゲームとは少し異なる獣です。 Javaバージョンです。Javaは、Cや他のゲームが一般的に記述されるC++。このため、Javaは、メモリ使用量の要件に関して本質的に不利です。これが、メインシステムメモリが次のような場合に大きな影響を与える理由です。 Javaで書かれた非常にリソース集約的なプログラムであるMinecraftを実行しています。

あなたのビデオRAMの使用率が低いことは驚くに値しません-そして、確かにあなたもそうするべきではありません。テクスチャとモデルを保存することだけが目的であり、Minecraftはまあ、ゲームベースです。キューブと16x16テクスチャでは、VRAMの使用率が非常に低い理由を理解できると思います。

34
Sam Forbis

Java MinecraftはCPUに負荷がかかりますが、GPUは実行する必要がほとんどなく、グラフィックスに関しては非常にシンプルで、グラフィックリソースは非常に少ないと言えます…Call of Duty。私が小さいと言うとき、私は非常に小さいことを意味し、100MBはほぼ正しい音です。

ゲームの「ブロック」デザインにより、必要なリソースが比較的少なくても画面を埋めることができます。 「レゴテクニクス」の代わりに「デュプロレゴ」を使用するようなものです。

Javaは「解釈された」言語です。つまり、ネイティブ命令にコンパイルされません。そのため、実行時には、プロセッサが理解できるものに命令(またはバイトコード)を取り込む仮想マシンが必要です。 CPUはGPUよりも多くの処理を実行しています。

10
user1165206

Java VMは、システムの大きなチャンクを予約する方法が原因で、RAMを大量に使用しているように見えますRAM使用する前にこれは、アプリケーションが実際に多くのRAMを使用しているようにOSに表示されます。Javaは、それが実行されているオペレーティングシステムからある程度独立して動作する独自のメモリヒープを使用します(ヒープを拡張するために呼び出しを使用します)。

Minecraftのテクスチャの読み込みはかなり低いです。また、OpenGLドライバーがテクスチャーを割り当てる方法も発生している可能性があります。たとえば、OpenGL 3.3では、GPUバッファをメモリにマップして、そのメモリセクションへの書き込みとその後のフラッシュによって、GPUのVRAM内に自動的に表示されるようにすることができます。これのトリッキーな部分は、このバッファーが本当にGPU側のみにあるのか、それとも実際にはCPUとGPU側の両方にあり、ドライバーが単に1つのバッファーから別のバッファーにコピーするのかです。 OpenGL仕様は、ドライバーがその裁量でどちらでも実行できると述べています。その結果、CPU/Java側がバッファに大量のアドレス空間を割り当て、CPU側とGPU側に1つずつ、バッファの2つのコピーが存在する可能性があります。

Javaプログラムが画像をRAMを独自のキャッシュに保存し、GPUにそのままロード/アンロードすることで、これには、RAMの使用がVRAMの使用より大きくない場合でも常に少なくとも同じである必要があります。

より最近のビデオドライバーとOpenGLサポートの反復 HSAアーキテクチャ 。これにより、VRAMをキャッシュのように機能させることができます。プログラムはテクスチャをGPUに「アップロード」することすらありません。単にメモリアドレスを渡すだけです。既に読み込まれているテクスチャに、または仮想メモリに割り当てられているファイルからテクスチャを参照します。 RAMまたはVRAMを使用する代わりに、メモリアドレス範囲場合によっては、これらの範囲の一部をRAMとディスクに割り当てることができます。VRAMはキャッシュとして最近保存されているだけなので、無制限または使用されていないように見えることがあります。 -任意に変更される可能性のある使用済みページ!

8
user515655

コーディングの問題ではありません。

指摘したいことがあります。最新のグラフィックスカードは、カード自体のMinecraftの大部分を処理できます。 PhysXのようなシステムは、CUDA、OpenCLなど、まさにそれを実行しようとします。その結果、これはVRAMの使用を増加させます。

以下は、(比較的言えば)グラフィックスドライバーに簡単にオフロードできるいくつかのことです。

  • ブロックのティックの更新(葉のブロックの死、照明の更新などを考えてください)
  • 手続き型生成
  • 流体の更新
  • 赤石
  • 物理

ただし、シェーダー言語(GLSL、HLSL、SPIR-V)でのGPU処理は、Javaのような高水準言語よりもはるかに難しく、バグが発生しやすくなります。したがって、これらすべてはCPUで実行されます。

いくつかのゲームは以前にGPUにそれらの一部を実装していましたが、Minecraftには、トリプルAタイトルのような大きな熟練したリソースプールがありませんでした。


数学

Minecraftが32ビットカラースキームを使用するとします。

32 bits per color
4 colors per pixel (red, green, blue, alpha)
8 bits per byte
(32 bits * 4 colors per pixel) / 8 bits per byte = 128 / 8 = 16 bytes per pixel.
100MB / 16 bytes per pixel = 6,250,000 pixels
sqrt(6250000) = 2500x2500 image resource in GPU (uncompressed)
2500 pixels wide|tall / 16 pixels wide|tall = 156.25 tiles wide|tall (assuming 16x16 tile size)
156.25 tiles wide * 156.25 tiles tall = ~24,414 16x16 tiles.

要約すると、VRAMの非圧縮32ビットイメージリソースに、約24,414、16x16タイルを格納できます。

この演習は、なぜ私が頭を包むのに本当に役立ちましたか Factorioはスプライトシートで問題がありました

2
Nathan Goings