我的笔记本电脑有一个很好的 GPU 和专用的视频 RAM。但我在玩 Minecraft 时注意到,电脑似乎没有使用它可以用来做任何事情。根据 Windows 任务管理器,它只使用了大约 100 MB,而它却占用了我大约一半的常规 RAM。
我原以为 VRAM 会用于存储模型、纹理等,这样可以减少对常规 RAM 的需求;如果这是真的,那么纹理和模型肯定比我想象的要小得多。(请注意,这是一个经过大量修改的安装,具有比标准 Minecraft 复杂得多的模型和纹理。)
如果不是真的,那是VRAM 有什么用途?有什么方法可以让我的电脑更好地利用它吗?
答案1
视频 RAM 专门用于存储渲染视频帧所需的任何内容。在玩游戏时,这包括纹理、模型和其他图形特定数据,如着色器信息和照明贴图。通常,正如您所提到的,这些数据都不会存储在主系统 RAM 中,尽管 VRAM 并非专门设计用于减少对常规 RAM 的需求。
Minecraft 与大多数游戏都有些不同。我猜你玩的是 PC 版的 Java 版。与其他游戏常用的 C 或 C++ 等编程语言相比,Java 是一种(相对)高级编程语言。正因为如此,Java 在内存使用要求方面天生就处于劣势。这就是为什么在运行 Minecraft(一个用 Java 编写的资源密集型程序)时,主系统内存会受到如此巨大的影响。
不过,我对您的视频 RAM 使用率低并不感到惊讶 - 老实说您也不应该感到惊讶。由于它仅用于存储纹理和模型,而 Minecraft 是一款基于立方体和 16x16 纹理的游戏,我想您可以理解为什么您的 VRAM 使用率如此之低。
答案2
Java 版 Minecraft 占用大量 CPU 资源,但 GPU 几乎无用武之地,图形方面非常简单,与《使命召唤》相比,图形资源非常小。我说小,是指非常小,100MB 听起来差不多。
由于游戏采用“块”设计,您可以用相对较少的资源填满屏幕。这就像使用“Duplo Lego”而不是“Lego Technics”。
Java 是一种“解释型”语言,这意味着它不会被编译为本机指令。因此,当它运行时,它需要一个虚拟机将指令(或字节码)转换为处理器可以理解的内容。您的 CPU 比 GPU 做的工作更多。
答案3
Java VM(例如 Minecraft 中使用的虚拟机)似乎会占用大量 RAM,因为它会保留大量系统 RAM在使用它之前。这在操作系统看来就像应用程序实际使用了那么多 RAM。Java 使用自己的内存堆,其工作方式与运行它的操作系统有些独立。(它仍将使用调用来增加堆)
minecraft 中的纹理加载速度相当低。也可能发生的是您的 OpenGL 驱动程序分配纹理的方式。例如,在 OpenGL 3.3 中,GPU 缓冲区可以映射到内存,这样写入并随后刷新该内存部分会使其自动出现在 GPU 的 VRAM 内。这其中的棘手部分在于这个缓冲区是否真的只在 GPU 端,或者它是否实际上在 CPU 和 GPU 端,而驱动程序只是将其从一个缓冲区复制到另一个缓冲区。OpenGL 规范规定驱动程序可以自行决定执行任何一项操作。结果是 CPU/Java 端为缓冲区分配了大量的地址空间,我们可能有两个缓冲区副本:一个在 CPU 端,一个在 GPU 端。
也有可能 Java 程序仍将图像存储在 RAM 中的缓存中,然后根据需要将其加载到 GPU 或从 GPU 卸载。这将要求 RAM 使用率始终至少与 VRAM 使用率相同(如果不大于)。
较新的视频驱动程序和 OpenGL 支持版本HSA 架构,这使得 VRAM 可以充当缓存 - 程序甚至不会将纹理“上传”到 GPU - 它只是将内存地址传递给已加载的纹理,甚至引用已分配到虚拟内存中的文件中的纹理。这使得评估资源使用情况变得更加困难,因为现在我们可能只使用内存,而不是简单地使用 RAM 或 VRAM地址范围在某些情况下,其中一些范围可以分配给 RAM,一些分配给磁盘,并且 VRAM 可能看起来无限或零使用,因为作为缓存,它只存储最近使用的页面,这些页面可能会任意更改!
答案4
这与糟糕的编码无关。
我想指出一点。现代显卡可以在显卡本身中处理 Minecraft 的大部分内容。PhysX 等系统试图做到这一点 — CUDA、OpenCL 等。因此,这会增加 VRAM 的使用率。
以下是一些可以轻松(相对而言)卸载到图形驱动程序的事情:
- 勾选块的更新(例如叶子块的死亡、照明的更新等)
- 程序生成
- 流畅更新
- 红石头
- 物理
然而,使用着色器语言(GLSL、HLSL、SPIR-V)进行 GPU 处理比使用 Java 等高级语言要困难得多,而且容易出错。因此,所有这些操作都在 CPU 上执行。
尽管之前已有数款游戏在 GPU 上实现了一些功能,但 Minecraft 并不像 3A 游戏那样拥有庞大且熟练的资源池。
数学
假设 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 的精灵表存在问题