使用glMapBuffer的优点

时间:2016-11-26 13:48:43

标签: java opengl

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

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

我有一个例子

方法1: 我创建了一个带顶点数据的浮点缓冲区,并直接将其传递给function myFunction(time,v) { var p="price"+time; var d="demo"+time; var y = document.getElementById(p).value; var z = v; var ans=y*z; document.getElementById(d).value = ans; } function my(time,ans) { //alert('You have not Login !!'); var p="demo"+time; var y = document.getElementById(p).value; //var z=y+ans; document.getElementById("total").innerHTML = ans; }

方法2: 我使用<table> <?php $i=0; while($i<=10) { ?> <tr> <td> <input id="price<?php echo $i; ?>" type="text" readonly value="5"></td> <td><input id="qty" type="number" value="0" onChange="myFunction(<?php echo $i; ?>,this.value)" ></td> <td><input id="demo<?php echo $i; ?>" type="text" value="0" onChange="my(<?php echo $i; ?>,this.value)" > </td> </tr> <?php $i++; }?> <h4> Total :- <span id = "total"></span></h4> </table>分配空间,我没有传递数据...... 我得到浮点缓冲区的引用... 我将浮点值写入...并取消映射缓冲区。

两种方法的优点和缺点是什么

我在两者上都这样做吗?

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

1 个答案:

答案 0 :(得分:2)

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

  1. 减少内存使用量。
  2. 避免不必要的数据复制,这可能会影响性能。
  3. 使用传入的数据调用glBufferData()包括以下内容:

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

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

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

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

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

        除此之外,如果您在功率/散热考虑因素发挥作用的设备上工作,除了执行速度之外,您可能还需要测量功耗。因为最快的解决方案可能不一定是最节能的。