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