代码之家  ›  专栏  ›  技术社区  ›  jay.lee

OpenGL缓冲对象内部工作?

  •  1
  • jay.lee  · 技术社区  · 14 年前

    目标 使用 . 这很有道理,因为这就是为什么OpenGL对BOs的调用会运行得如此之快。但在什么样的情况下,它会驻留在AGP或系统内存中呢?(附带问题:PCI-e是否有AGP内存的等价物?)

    也, glMapBuffers() glReadPixels() PBO显然比 glReadPixels() 从性能差异可以明显看出,我只是不明白怎么做。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Yakov Galka    14 年前

    我不能告诉你缓冲区对象将被分配到什么内存中。实际上,你基本上是自己回答这个问题的,所以你可以希望一个好的司机会这样做。

    glMapBuffer的实现方式与内存映射文件相同。记住物理内存和虚拟地址空间之间的区别:当您写入内存位置时,地址通过页表映射到物理位置。如果所需的页面被标记为已调出,则会发生中断,系统会将所需页面从调出加载到RAM。此机制可用于将文件和其他资源(如GPU内存)映射到进程的虚拟地址空间。当您调用glMapBuffer时,系统会分配一些地址范围(不是内存,只是地址),并准备页表中的相关条目。当您尝试读/写这些地址时,系统会将其加载/发送到GPU。当然这将是缓慢的,所以一些缓冲是在途中完成的。

    如果你经常在CPU和GPU之间传输数据,我怀疑PBOs会更快。在GPU上进行许多操作(例如从帧缓冲区加载,用CPU更改一些texel,并在GPU上再次将其用作纹理)时,它们会更快。在集成图形处理器或AGP内存的情况下,它们可以更快,因为在这种情况下glMapBuffer可以将地址直接映射到物理内存,有效地消除了一次拷贝操作。

    FBO更好吗?为什么?当您需要渲染到纹理时,它们会更好。这又是因为它们消除了一个数据拷贝操作。