Java 使用glMapBuffer的优点

Java 使用glMapBuffer的优点,java,opengl,Java,Opengl,当我使用glMapBuffer时,我得到一个float(byte)缓冲区作为返回类型,我可以使用它修改服务器端的数据 但是这样做有什么性能优势吗 我有一个例子 方法1: 我使用顶点数据创建一个浮点缓冲区,并将其直接传递给glBufferData 方法2: 我使用glBufferData分配空间,不传递任何数据。。。 我得到一个浮点缓冲区的引用。。。 我将浮点值写入到。。。我取消了缓冲区的映射 两种方法的优缺点是什么 我在这两方面都做了同样的事情吗 我认为第二种方法避免了缓冲区的重复。这有两个非常

当我使用
glMapBuffer
时,我得到一个float(byte)缓冲区作为返回类型,我可以使用它修改服务器端的数据

但是这样做有什么性能优势吗

我有一个例子

方法1: 我使用顶点数据创建一个浮点缓冲区,并将其直接传递给
glBufferData

方法2: 我使用
glBufferData
分配空间,不传递任何数据。。。 我得到一个浮点缓冲区的引用。。。 我将浮点值写入到。。。我取消了缓冲区的映射

两种方法的优缺点是什么

我在这两方面都做了同样的事情吗


我认为第二种方法避免了缓冲区的重复。

这有两个非常相关的方面:

  • 减少内存使用
  • 避免不必要的数据复制,这可能会影响性能
  • 在传入数据的情况下调用
    glBufferData()
    ,包括以下内容:

  • 您可以分配缓冲内存来存储数据
  • 您将数据存储在分配的缓冲区中
  • 调用
    glBufferData()
    时,OpenGL实现为数据分配内存
  • OpenGL实现将数据从缓冲区复制到自己的分配中
  • 将此与使用缓冲区映射执行相同操作时发生的情况进行比较:

  • 调用
    glBufferData()
    时,OpenGL实现为数据分配内存
  • 调用
    glMapBuffer()
    时,OpenGL实现返回指向其内存的指针
  • 您将数据存储在此内存中
  • 您可以取消映射缓冲区
  • 如果比较这两个序列,第一个序列中会有额外的内存分配,这意味着它总共需要两倍的内存。OpenGL实现必须在第一个缓存中复制缓冲区数据,而在第二个缓存中则不是这样

    事实上,事情可能会变得更复杂一些。特别是在具有专用图形内存(VRAM)的系统上,可能会有更多的数据副本。但原则仍然是,可以减少额外的内存分配和复制

    要记住的另一个方面是,如果您想在缓冲区已经使用之后修改其内容,那么在缓冲区的初始使用之后会发生什么。同样,
    glMapBuffer()
    通常会减少额外的数据复制量,但它可能会以不希望的同步为代价。因此,为
    glBufferData()
    glBufferSubData()
    所需的额外副本支付费用可能更有效,以避免同步点

    如果您有这些更复杂的情况,您经常修改缓冲区数据,那么您确实需要开始基准测试,并且您必须预期供应商之间的差异。您还可以研究使用缓冲区映射的方案,但使用循环使用的缓冲区池而不是单个缓冲区,以减少/避免同步带来的性能损失


    最重要的是,如果您在需要考虑电源/热的设备上工作,除了执行速度之外,您可能还需要测量电源使用情况。因为最快的解决方案不一定是最省电的。

    图形卡和驱动程序很可能会有所不同。唯一确定的方法是测量。但一般来说,
    glBufferData
    的性能可能会更好。创建池…并不意味着经常切换状态?。。顺便提一下thanks@YashwanthCB您需要一些绑定缓冲区的调用,但这没什么大不了的。这种方法更大的缺点是,您当然会再次使用更多内存。因此,使用更少内存的优势消失了,但您可以通过避免额外的数据复制来最大限度地提高效率。@YashwanthCB:注意,这篇文章是在讨论C/C++如何与OpenGL交互。一旦Java和它的
    ByteBuffer
    类型参与进来,它就开始完全依赖于那些
    ByteBuffer
    类型的工作方式。那么它将如何依赖。我已经将它标记为Java。我用过bytebuffer。因此,在您的解释中要清楚,plzI希望如果您使用直接缓冲区(如果您不知道这意味着什么),就不会因为使用Java而产生额外的副本。但我还没有证实。无论如何,一旦JavaAPI调用被编组到其本机实现中,我的答案中的所有内容仍然适用。