【问题标题】:I stored more data on VRAM than it's actual size. How is that possible?我在 VRAM 上存储了比实际大小更多的数据。这怎么可能?
【发布时间】:2014-11-04 09:51:02
【问题描述】:

我正在分析我的简单体素化世界渲染器的性能。我想找到一种不同技术的性能限制,一种压力测试。在某些时候,我发现了一些非常奇怪的东西。我为每个块使用不同的 VBO 以块的形式分配几何数据。我正在使用一些编程到引擎中的计数器来帮助我查看数据发生了什么。

所以在这里我试图分配 664 个包含 1 199 824 个体素的块,这些体素是使用 28 795 776 个顶点构建的。
每个顶点由 3 个用于位置的浮点数、3 个用于法线向量的浮点数和 4 个用于 RGBA 颜色的浮点数组成。 Float 显然是 4 字节的大小,因此我计算出整个世界的估计内存大小约为 1098Mb ( vertexcount * 3 * 4 * 2 + vertexCount * 4*4)。
我以惊人的 7 FPS 速度运行了该程序,但它运行良好,看起来也应有尽有。问题是我正在使用带有 1 GB 显存的 GiGabyte GeForce GTX 460 OC2。那么我如何能够分配 VBO 1098Mb 的数据呢?
数据是否在 VRAM 中以某种方式缓存过?
或者我不知道有几 Mb 的保留内存?是我的计数器给我错误结果的唯一解释,还是希望有一些我不知道的东西,但视频内存管理?

【问题讨论】:

    标签: opengl memory gpu vbo


    【解决方案1】:

    你说的 VRAM 是什么? ;)

    OpenGL 没有 VRAM 或显卡本地内存的概念。 OpenGL 中只有“内存”,这纯粹是抽象的。可以根据需要将数据从 GPU 本地内存交换到系统内存并返回。

    如果硬件支持(GTX460 支持!)纹理甚至可以大于可用的 GPU 本地内存,并且所需的纹理子数据会按需交换。

    【讨论】:

    • 所以你是说当我填充VBO时它不一定将数据存储在显卡内存中?我认为这是使用它的目的。那么我如何确定我的数据是否真的存储在显卡上呢?交换何时发生以及在什么条件下发生?我真的很好奇!
    • 就像你可以在你的 CPU 用完 RAM 时在磁盘上分配交换空间一样,如果 GPU 用完可用内存,它可以暂时将一些不常用的数据移到那里,并在它是必需的。当这种情况发生时(故意)留给驱动程序和 GPU,我不认为 OpenGL 公开了一种机制来获取一段内存是否实际上在 GPU 上。
    • 看来我真的不会内存不足,可以吗?我真的很感兴趣那个交换的性能成本是多少,我肯定会更深入地研究这个话题。感谢您的洞察力!
    • @Shilghter:您主要受外围总线带宽的限制。当然,这也涉及访问延迟,但只有在外围总线速度快几个数量级时,您才会感觉到这些延迟。你当然可以用完内存。你只有这么多的系统 RAM 和磁盘交换 :)
    • GPU 也可以直接从系统内存中读取数据。并非它使用的所有内容都在 VRAM 中。
    猜你喜欢
    • 2019-06-24
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多